Python Glossary English

все Python 3Итераторы и генераторыпонятие

Генераторное выражение

генераторы

Ленивый аналог list comprehension в круглых скобках. Не создаёт список в памяти.

Синтаксис

(expr for x in iterable if condition)

Генератор одноразовый: после list(gen) второй проход даст пустоту, а не прежние значения — частая причина «почему сумма ноль». Ещё тонкость: самое левое iterable вычисляется сразу при создании выражения, а всё остальное — лениво, поэтому изменение внешних переменных после создания генератора повлияет на результат.

Примеры

gen = (x**2 for x in range(5))
print(type(gen))  # → generator
print(list(gen))  # → [0,1,4,9,16]
# Ленивость — память не расходуется
big_gen = (x**2 for x in range(10**6))
print(next(big_gen))  # → 0
print(next(big_gen))  # → 1
# sum с генератором
print(sum(x**2 for x in range(10)))  # → 285
# Фильтрация
evens = (x for x in range(20) if x%2==0)
print(list(evens))  # → [0,2,4,6,8,10,12,14,16,18]
# В функции — скобки не нужны
print(max(len(s) for s in ['hi','hello','ok']))  # → 5
# Вложенный генератор
matrix = [[1,2],[3,4],[5,6]]
flat = (x for row in matrix for x in row)
print(list(flat))  # → [1,2,3,4,5,6]

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности