Протокол итератора проверяет понимание того, как Python делает for, next() и ленивые обходы коллекций.
Протокол итератора — это набор правил, по которым объект можно последовательно “перебирать”.
Объект-итерабельный должен уметь отдавать итератор через __iter__().
Итератор должен уметь возвращать следующий элемент через __next__() и бросать StopIteration, когда элементы закончились.
Цикл for автоматически использует эти методы: получает итератор и вызывает next() до завершения.
Опишу это как контракт между вашим объектом и Python-циклом.
Протокол итератора — это соглашение:
итерабельный объект реализует
__iter__()и возвращает итератор;итератор реализует
__next__()и сигнализирует завершение исключениемStopIteration.
Итерабельный (iterable)
умеет отвечать на iter(obj)
обычно хранит данные (список, строка, файл, генераторная “обёртка” и т.д.)
Итератор (iterator)
умеет отвечать на next(it)
хранит состояние обхода (позицию, курсор и т.п.)
forОбычно происходит примерно так:
Python вызывает iter(obj) → это использует obj.__iter__()
Затем многократно вызывает next(it) → это использует it.__next__()
При StopIteration цикл завершается
class CountDown:
def __init__(self, start: int):
self.current = start
def __iter__(self):
return self # сам себе итератор
def __next__(self):
if self.current <= 0:
raise StopIteration
value = self.current
self.current -= 1
return value
for x in CountDown(3):
print(x) # 3 2 1
Ленивые вычисления (не грузить всё в память сразу)
Потоковая обработка данных (файлы, сокеты, курсоры БД)
Кастомные обходы (деревья, графы, пагинация)
Если вы хотите, чтобы объект “естественно” работал с for, list(), sum(), any() и т.д., реализуйте протокол итератора корректно: __iter__() + __next__() + StopIteration.