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 является важным сигналом, который сообщает, что генератор больше не имеет значений для выдачи и итерация должна быть завершена.