Короткий ответ
Генераторы — простой и экономный по памяти способ создавать итераторы в Python. Функция становится генераторной, если в её теле встречается ключевое слово yield: при вызове она возвращает объект-генератор, который выдаёт значения по одному, только когда их запрашивают.
Как это работает подробнее
Ленивый механизм позволяет не хранить всю последовательность в памяти, что важно для больших и даже бесконечных данных.
- Приостановка. Каждый раз при выполнении
yieldфункция приостанавливается, возвращает текущее значение и запоминает своё состояние. - Продолжение. При запросе следующего значения через
forилиnext()выполнение возобновляется ровно с места остановки. - Полноценный итератор. Генератор автоматически реализует методы
__iter__()и__next__(). - Завершение. Когда функция доходит до конца или встречает
return, выбрасывается исключениеStopIteration, сигнализирующее об исчерпании.
Пример кода
Генератор чисел от 1 до max
def fun(max):
cnt = 1
while cnt <= max:
yield cnt
cnt += 1
ctr = fun(5) # ctr — объект-генератор
for n in ctr:
print(n) # 1 2 3 4 5Что использовать на практике
- Большие данные. Для чтения потоков и обработки больших последовательностей используй генераторы вместо построения списков целиком.
- Бесконечные данные. Генераторы позволяют работать с бесконечными последовательностями, порождая элементы по требованию.
- Ленивые вычисления. Вычисляй очередной элемент только в момент запроса, экономя память и время на старте.