def my_generator(n):
for i in range(n):
yield i
gen = my_generator(3)
print(next(gen)) # 0
print(next(gen)) # 1
print(next(gen)) # 2
Создать генератор в Python с помощью yield
очень просто. Вместо того чтобы возвращать все значения сразу (как функция с return
), генератор "выдает" значения по одному по требованию, приостанавливая свое выполнение между выдачами. Это делает генераторы очень эффективными для работы с большими объемами данных, которые не обязательно хранить в памяти целиком.
Основной принцип: функция, содержащая оператор yield
, автоматически становится генератором.
Пример:
def my_generator(n):
"""Генератор, выдающий числа от 0 до n-1"""
for i in range(n):
yield i
# Использование генератора:
gen = my_generator(5) # Создаем объект генератора
# Получаем значения по одному:
print(next(gen)) # Выведет: 0
print(next(gen)) # Выведет: 1
print(next(gen)) # Выведет: 2
print(next(gen)) # Выведет: 3
print(next(gen)) # Выведет: 4
# После исчерпания значений генератора, next(gen) вызовет StopIteration
# Можно использовать в цикле:
for value in my_generator(3):
print(value) # Выведет 0, 1, 2
Ключевые моменты:
yield
"замораживает" состояние функции-генератора. При следующем вызове next()
выполнение продолжится с места, где был оператор yield
.return
, она вызывает исключение StopIteration
, сигнализируя об окончании генерации значений.for
. Цикл for
автоматически обрабатывает исключение StopIteration
.__iter__()
и __next__()
, в то время как генератор создается автоматически с помощью yield
.Преимущества использования генераторов: