Какое исключение выбрасывается при завершении итерации?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
StopIteration — исключение при завершении итерации
Когда вы работаете с итераторами в Python, StopIteration — это исключение, которое автоматически выбрасывается при завершении итерации. Это центральный механизм протокола итератора.
Как это работает
Каждый итератор имеет метод __next__(), который возвращает следующий элемент последовательности. Когда элементов больше нет, метод выбрасывает исключение StopIteration:
class SimpleIterator:
def __init__(self, max):
self.current = 0
self.max = max
def __iter__(self):
return self
def __next__(self):
if self.current < self.max:
self.current += 1
return self.current
else:
raise StopIteration # Конец итерации
iterator = SimpleIterator(3)
for num in iterator:
print(num) # 1, 2, 3
Явный вызов next()
Вы также можете явно вызывать встроенную функцию next(), которая вызывает метод __next__() итератора:
my_list = [1, 2, 3]
iterator = iter(my_list)
print(next(iterator)) # 1
print(next(iterator)) # 2
print(next(iterator)) # 3
print(next(iterator)) # StopIteration исключение
У функции next() есть опциональный параметр по умолчанию, чтобы избежать исключения:
iterator = iter([1, 2, 3])
print(next(iterator, 'no more')) # 1
print(next(iterator, 'no more')) # 2
print(next(iterator, 'no more')) # 3
print(next(iterator, 'no more')) # 'no more' (не выбрасывает исключение)
Отловить StopIteration
Вы можете явно отловить это исключение, хотя обычно цикл for скрывает это от вас:
iterator = iter([1, 2, 3])
try:
while True:
value = next(iterator)
print(value)
except StopIteration:
print('Итерация завершена')
Генераторы и StopIteration
В генераторах используется ключевое слово return, чтобы выбросить StopIteration:
def my_generator():
yield 1
yield 2
yield 3
return # Выбрасит StopIteration
for value in my_generator():
print(value) # 1, 2, 3
Важное изменение в Python 3.7+
В Python 3.7+ исключение StopIteration внутри функции (в том числе генератора) преобразуется в RuntimeError. Это предотвращает случайное распространение StopIteration за границы функции:
def problematic():
iterator = iter([1, 2, 3])
while True:
value = next(iterator) # Может выбросить StopIteration
yield value
for item in problematic():
print(item)
Ключевые моменты
- StopIteration — стандартное исключение для завершения итерации
- Цикл
forавтоматически обрабатывает это исключение - Используйте
next(..., default)для безопасного получения следующего элемента - В генераторах
returnвыбрасывает StopIteration - Python 3.7+ преобразует StopIteration в RuntimeError при распространении за границы функции