Ответ
Генератор создается с помощью ключевого слова yield. Когда функция содержит yield, она возвращает специальный объект-генератор, а не выполняет код сразу. Генератор сохраняет свое состояние между вызовами и генерирует значения по одному по мере необходимости (ленивые вычисления).
Пример простого генератора:
def countdown(n):
"""Генератор, который отсчитывает от n до 1."""
while n > 0:
yield n
n -= 1
# Использование
for number in countdown(5):
print(number) # Выведет: 5, 4, 3, 2, 1
Почему это полезно:
- Экономия памяти: Генератор не хранит всю последовательность в памяти, а вычисляет каждое значение на лету. Это критично для работы с большими или бесконечными потоками данных.
- Ленивые вычисления: Код внутри функции выполняется только при обращении к следующему элементу (например, в цикле
forили при вызовеnext()).
Выражение-генератор (generator expression) — это более компактная форма, похожая на list comprehension:
# List comprehension (создает список в памяти)
squares_list = [x**2 for x in range(1000000)]
# Generator expression (ленивое вычисление)
squares_gen = (x**2 for x in range(1000000))
print(next(squares_gen)) # 0
print(next(squares_gen)) # 1