Выражения-генераторы
Пишите компактные ленивые конвейеры
«Выражения-генераторы» — бесплатный урок Python Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
От списочного включения к выражению-генератору
Выражение-генератор выглядит как списочное включение, но использует круглые скобки вместо квадратных. Оно создаёт значения лениво, а не формирует полный список.
list_comp = [x * x for x in range(5)]
gen_expr = (x * x for x in range(5))
print(list_comp)
print(gen_expr)
print(list(gen_expr))Разница в использовании памяти
Списочное включение заранее выделяет память для каждого элемента. Выражение-генератор почти ничего не хранит, пока Вы не запросите значения. Сравните размеры этих объектов.
import sys
lst = [x for x in range(10000)]
gen = (x for x in range(10000))
print('list bytes:', sys.getsizeof(lst))
print('gen bytes:', sys.getsizeof(gen))Перебор выражения-генератора
Вы потребляете выражение-генератор так же, как любой итератор: с помощью цикла for, вызова next() или передачи его функции.
gen = (c.upper() for c in 'hello')
for ch in gen:
print(ch)Фильтрация с помощью if
Добавьте условие if, чтобы оставить только подходящие элементы, как в списочном включении.
evens = (n for n in range(10) if n % 2 == 0)
print(list(evens))Прямая передача функциям
Если выражение-генератор является единственным аргументом функции, дополнительные круглые скобки можно опустить. Это делает запись чище и позволяет не создавать временный список.
total = sum(x * x for x in range(5))
print(total)
biggest = max(len(w) for w in ['a', 'abc', 'ab'])
print(biggest)Напоминание об однократном использовании
Выражение-генератор исчерпывается после одного прохода, как и функция-генератор. При второй попытке перебора оно ничего не выдаёт.
gen = (x for x in range(3))
print(list(gen))
print(list(gen))Объединение выражений
Можно передать одно выражение-генератор другому и построить ленивый конвейер. Ничего не вычисляется, пока конечный потребитель не запросит значения.
nums = (n for n in range(10))
evens = (n for n in nums if n % 2 == 0)
doubled = (n * 2 for n in evens)
print(list(doubled))any() и all()
Выражения-генераторы особенно полезны с any() и all(), поскольку эти функции могут завершить работу досрочно, как только ответ становится известен.
words = ['cat', 'dog', 'elephant']
print(any(len(w) > 5 for w in words))
print(all(len(w) >= 3 for w in words))Вложенные циклы
Как и списочные включения, выражения-генераторы поддерживают несколько условий for, которые читаются слева направо.
pairs = ((x, y) for x in range(2) for y in range(2))
print(list(pairs))Пример ленивого конвейера
Перед Вами небольшой конвейер обработки текста. Каждый этап работает лениво, поэтому очень большой файл можно обрабатывать потоково, не загружая его целиком.
lines = [' alpha ', '', ' beta', 'gamma ']
stripped = (line.strip() for line in lines)
nonempty = (line for line in stripped if line)
print(list(nonempty))Как сделать выбор
Используйте списочное включение, когда данные понадобятся несколько раз или потребуется доступ по индексу. Используйте выражение-генератор для потоковой обработки за один проход или для больших объёмов данных.
data = range(6)
as_list = [x + 1 for x in data]
print(as_list[0], as_list[-1])
total = sum(x + 1 for x in data)
print(total)Быстрая проверка
Проверьте, насколько хорошо Вы понимаете выражения-генераторы.
Итоги
Вы изучили выражения-генераторы:
- Круглые скобки позволяют получить ленивую альтернативу списочным включениям.
- Они экономят память и поддерживают фильтры
ifи вложенные циклы. - Они хорошо сочетаются с
sum,any,allи объединением в цепочки. - Их можно использовать только один раз.
Далее Вы узнаете, как объединять генераторы с помощью yield from.
Часто задаваемые вопросы
Урок «Выражения-генераторы» бесплатный?
Да — полный текст урока «Выражения-генераторы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Выражения-генераторы»?
Пишите компактные ленивые конвейеры Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Выражения-генераторы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Протокол итератора
- Функции-генераторы
- Выражения-генераторы
- yield from и делегирование