Идея
Итератор последовательно отдаёт элементы коллекции, не раскрывая её внутреннее устройство (массив, связный список, дерево, граф). Клиент задаёт только два вопроса: «есть ли следующий?» и «дай его». Плюсы: одну коллекцию можно обходить в разном порядке, несколько обходов одновременно не мешают друг другу, а при смене внутреннего устройства клиентский код не меняется.
Протокол в Python
В Python паттерн встроен в язык: iterable возвращает итератор методом __iter__(), а итератор отдаёт следующий элемент через __next__() и в конце поднимает StopIteration. for, list(), sum(), in работают именно через этот протокол. Подробнее: протокол итерации.
class Countdown:
def __init__(self, start):
self.current = start
def __iter__(self):
return self
def __next__(self):
if self.current <= 0:
raise StopIteration
self.current -= 1
return self.current + 1