Генератор — это особый вид итератора, который позволяет лениво (по требованию) генерировать значения, не загружая их все в память сразу. Генераторы создаются с помощью функций с yield
или генераторных выражений.
Используют ключевое слово yield
вместо return
:
def countdown(n):
print("Starting countdown from", n)
while n > 0:
yield n # Возвращает значение и приостанавливает выполнение
n -= 1
print("Countdown finished!")
# Использование:
for num in countdown(3):
print(num) # Выводит 3, 2, 1
Похожи на list comprehensions, но используют круглые скобки:
squares = (x**2 for x in range(5)) # Генераторное выражение
print(next(squares)) # 0
print(next(squares)) # 1
next()
выполнение идет до первого yield
next()
выполнение продолжается с места остановкиStopIteration
def simple_gen():
yield "first"
yield "second"
yield "third"
gen = simple_gen()
print(next(gen)) # "first"
print(next(gen)) # "second"
print(next(gen)) # "third"
print(next(gen)) # StopIteration
# Бесконечная последовательность
def infinite_sequence():
num = 0
while True:
yield num
num += 1
# Конвейерная обработка
def pipeline(data):
squared = (x**2 for x in data)
negated = (-x for x in squared)
return negated
Характеристика | Генераторы | Итераторы |
---|---|---|
Синтаксис | yield или генераторные выражения | Реализация __next__ |
Сложность реализации | Простая | Более сложная |
Состояние | Сохраняется автоматически | Нужно управлять вручную |
def read_large_file(file_path):
with open(file_path) as f:
for line in f:
yield line.strip()
def fibonacci():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
def process_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)
return filtered
Генераторы могут не только выдавать значения, но и получать их через send()
:
def accumulator():
total = 0
while True:
value = yield total
if value is None:
break
total += value
gen = accumulator()
next(gen) # Инициализация
print(gen.send(10)) # 10
print(gen.send(20)) # 30
Генератор — это особый вид итератора, создаваемый с помощью функций с yield
или генераторных выражений. Ключевые преимущества: ленивые вычисления, экономия памяти и простота создания бесконечных последовательностей. Генераторы идеально подходят для обработки потоков данных, работы с большими файлами и создания конвейеров обработки.