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