Python: генераторы списков
«Python: генераторы списков» — тема, где важно не заучивание, а аккуратность. Показываем по шагам: определения, разбор типового задания, оформление ответа и критерии.
Что такое генераторы списков в Python
Если обычная программа заставляет тебя писать длинный цикл ради простого списка чисел, код быстро становится похож на черновик с повторениями. Генератор списков помогает записать ту же идею короче: описать, какие элементы нужно получить и по какому правилу. В результате ты быстрее решаешь задачи по математике, работаешь с последовательностями и лучше понимаешь алгоритмы. После разбора можно сразу перейти в личный кабинет для бесплатной практики и проверить себя на коротких заданиях.
Генератор списка, или list comprehension, создаёт новый список на основе другого объекта: диапазона чисел, строки, готового списка. Его удобно читать как фразу: «взять элемент из последовательности и добавить его в список». Общая форма выглядит так:
[выражение for элемент in последовательность]
Например, нам нужны квадраты чисел от 1 до 5. Выражением будет элемент · элемент, а последовательностью — range(1, 6). Важно: range(1, 6) включает 1, но не включает 6.
Как работает запись по шагам
Разберём генератор изнутри. Сначала Python получает очередной элемент последовательности. Затем подставляет его в выражение. Получившийся результат добавляется в новый список. Процесс повторяется, пока последовательность не закончится.
[x² for x in range(1, 6)]
\( \to x = 1 \to 1^2 \)
\( \to x = 2 \to 2^2 \)
\( \to x = 3 \to 3^2 \)
\( \to x = 4 \to 4^2 \)
\( \to x = 5 \to 5^2 \)
→ [1, 4, 9, 16, 25]
Слева от for находится результат, который попадёт в список. После for указывается переменная цикла, затем in и источник данных. Переменная x существует только внутри этого выражения, поэтому её имя можно выбрать самостоятельно: number, value или item.
Ту же задачу можно решить обычным циклом. Генератор не меняет математический смысл вычислений, а делает короткую запись более компактной. Но компактность не должна мешать пониманию: если выражение слишком сложное, лучше использовать несколько понятных строк.
Прочитай генератор слева направо и задай три вопроса: откуда берём элементы, что вычисляем, сколько раз повторяем. Такой алгоритм помогает не путать порядок частей записи.
Условие и фильтрация элементов
Генератор может не только преобразовывать все элементы, но и выбирать подходящие. Для этого после последовательности добавляют условие if:
[выражение for элемент in последовательность if условие]
Например, найдём чётные числа от 1 до 10. Число является чётным, если остаток от деления на 2 равен нулю. В Python остаток обозначается оператором %.
\( [x for x in range(1, 11) if x \% 2 == 0] \)
→ [2, 4, 6, 8, 10]
Здесь в итоговый список попадает сам x, но только тогда, когда условие x % 2 == 0 истинно. Можно одновременно фильтровать и преобразовывать элементы:
\( [x^2 for x in range(1, 11) if x \% 2 == 0] \)
→ [4, 16, 36, 64, 100]
Не путай знак сравнения == с одиночным =. Первый проверяет равенство, второй присваивает значение переменной.
Разобранный пример и полезные приёмы
Задача: из списка температур выбрать значения не ниже нуля и перевести их из градусов Цельсия в условные единицы по формуле y = t × 2 + 3. Нужно получить новый список.
\( temperatures = [-4, 0, 5, 12] \)
\( result = [t \times 2 + 3 for t in temperatures if t \ge 0] \)
print(result)
→ [3, 13, 27]
В реальном Python для умножения используется символ *, а для сравнения — >=. Запись с Unicode выше показывает математическую идею, а рабочий вариант будет таким:
\( temperatures = [-4, 0, 5, 12] \)
\( result = [t * 2 + 3 for t in temperatures if t >= 0] \)
print(result)
→ [3, 13, 27]
Сначала цикл проверяет -4 и отбрасывает его. Затем берёт 0: условие подходит, поэтому вычисляет 0 × 2 + 3 = 3. Для 5 получает 13, для 12 — 27. Полезно помнить: условие фильтрует исходное значение t, а выражение формирует итоговый элемент.
Для строк работает тот же принцип: [word.upper() for word in words] создаёт список слов в верхнем регистре.
Типичные ошибки и проверка результата
Первая ошибка — перепутать порядок частей. Запись [for x in numbers x²] неверна: выражение должно стоять перед for, а условие — после if. Вторая ошибка — забыть квадратные скобки. Именно они показывают, что создаётся список.
Третья проблема связана с range. Вызов range(1, 5) даёт 1, 2, 3, 4, но не 5. Перед решением выпиши границы отдельно и проверь количество элементов. Четвёртая ошибка — ожидать, что исходный список изменится. Генератор создаёт новый объект, поэтому результат нужно сохранить в переменную или вывести.
| Задача | Генератор | Результат |
|---|---|---|
| Квадраты | [x * x for x in range(1, 4)] | [1, 4, 9] |
| Нечётные | [x for x in range(6) if x % 2 != 0] | [1, 3, 5] |
| Длины слов | [len(word) for word in words] | числа длин |
Если запись трудно проверить, временно разверни её в обычный цикл. А затем можешь закрепить тему через бесплатную практику в личном кабинете.
Не называй генератор списка обычным генератором Python: list comprehension сразу создаёт список, а функция с yield выдаёт значения постепенно. Эти конструкции связаны идеей перебора, но работают по-разному.
Что запомнить
Генератор списка — компактная запись для создания нового списка. Базовый шаблон: [выражение for элемент in последовательность]. Выражение отвечает за результат, for запускает перебор, in указывает источник. Условие if после последовательности оставляет только подходящие элементы.
Всегда проверяй границы range, разницу между = и ==, а также символ умножения в настоящем Python: *. Если формула сложная, сначала реши задачу обычным циклом, затем сократи запись. Для математических задач генераторы особенно удобны при построении квадратов, фильтрации чётных чисел и обработке таблиц значений.
Следующий шаг — зарегистрируйся и реши 5 заданий бесплатно: составь список квадратов, выбери числа по условию и сравни генератор с обычным циклом.
Что такое генератор списка?
Это выражение в квадратных скобках, которое создаёт новый список на основе последовательности и заданного правила.
Можно ли использовать условие?
Да. Условие добавляют после части for, например [x for x in numbers if x >= 0].
Чем генератор списка отличается от цикла?
Он выполняет ту же идею перебора, но записывается компактнее и сразу формирует список.
Как закрепить тему после разбора?
Реши несколько задач: создай список квадратов, отфильтруй чётные числа и преобразуй элементы по формуле. Затем разверни один пример в обычный цикл и сравни записи.
Закрепить тему на практике
Теория без практики забывается за неделю. В личном кабинете Просто Урок — задания именно по этой теме с проверкой каждого шага. Регистрация бесплатная.