Генераторы — это уникальная и мощная особенность Python, которая предоставляет несколько ключевых преимуществ по сравнению с обычными функциями и коллекциями. Вот их основные особенности:
Генераторы вычисляют значения по требованию, а не заранее. Это позволяет:
def infinite_sequence():
num = 0
while True:
yield num
num += 1
gen = infinite_sequence()
print(next(gen)) # 0
print(next(gen)) # 1
# Может продолжаться бесконечно без переполнения памяти
Генераторы автоматически сохраняют свое состояние между вызовами:
def stateful_generator():
state = 0
while state < 3:
yield state
state += 1
gen = stateful_generator()
print(list(gen)) # [0, 1, 2]
Генераторы не хранят всю последовательность в памяти, а генерируют элементы по одному:
# Обработка большого файла без загрузки в память
def read_large_file(filename):
with open(filename) as f:
for line in f:
yield line.strip()
Генераторы идеально подходят для:
def processing_pipeline(data):
# Каждый шаг обрабатывает элементы по одному
validated = (x for x in data if x is not None)
transformed = (transform(x) for x in validated)
filtered = (x for x in transformed if x > 0)
yield from filtered
В отличие от обычных функций, генераторы могут получать данные во время выполнения через send()
:
def interactive_gen():
total = 0
while True:
value = yield total
if value is None:
break
total += value
gen = interactive_gen()
next(gen) # Инициализация
print(gen.send(10)) # 10
print(gen.send(20)) # 30
Синтаксис yield from
позволяет делегировать выполнение другому генератору:
def combined_generator():
yield from range(3)
yield from 'abc'
print(list(combined_generator())) # [0, 1, 2, 'a', 'b', 'c']
Генераторы автоматически реализуют методы __iter__()
и __next__()
, что делает их:
for
itertools
и другими функциями обработки последовательностейdef countdown(n):
while n > 0:
yield n
n -= 1
# Работает в любом месте, где ожидается итератор
for num in countdown(3):
print(num) # 3, 2, 1
Генераторы в Python особенные благодаря:
send()
Они предоставляют элегантное решение для задач, требующих поточной обработки, работы с большими данными и реализации сложных итерационных паттернов.