← Назад к вопросам

Какое исключение выбрасывается при завершении итерации?

1.0 Junior🔥 111 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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 при распространении за границы функции
Какое исключение выбрасывается при завершении итерации? | PrepBro