все 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Сообщить о неточности