Вопрос проверяет понимание того, как генераторы сигнализируют о завершении и как это обрабатывается в Python.
Генератор считается завершённым, когда он больше не может вернуть значения. В этом случае при вызове next() возбуждается исключение StopIteration. Обычно разработчик не обрабатывает это вручную, потому что цикл for перехватывает StopIteration автоматически. Если же используется next() напрямую, завершение можно определить через try/except.
Генератор возвращает значения, пока в его коде встречаются yield. Когда выполнение функции доходит до конца или выполняется return, генератор сигнализирует о завершении.
Определение: StopIteration — исключение, которое сообщает, что итератор или генератор исчерпан и больше не имеет элементов.
Через for
Цикл for сам отслеживает завершение генератора:
for x in gen():
print(x)
# Когда значения заканчиваются, цикл просто завершится
Через next() и обработку исключения
g = gen()
while True:
try:
print(next(g))
except StopIteration:
print("Генератор завершился")
break
Через функцию next(..., default)
Можно указать значение по умолчанию:
value = next(g, None)
# Если генератор завершён, вернётся None
Если в генераторе используется return value, это значение передаётся в объект StopIteration и доступно как e.value, но в обычных циклах это значение не используется.
Генератор считается завершённым, когда при очередном next() возникает StopIteration. В большинстве случаев это обрабатывается автоматически циклом for.