Клиент работает только с итератором и не знает устройства коллекции
Клиент работает только с итератором и не знает устройства коллекции

Идея

Итератор последовательно отдаёт элементы коллекции, не раскрывая её внутреннее устройство (массив, связный список, дерево, граф). Клиент задаёт только два вопроса: «есть ли следующий?» и «дай его». Плюсы: одну коллекцию можно обходить в разном порядке, несколько обходов одновременно не мешают друг другу, а при смене внутреннего устройства клиентский код не меняется.

Протокол в Python

В Python паттерн встроен в язык: iterable возвращает итератор методом __iter__(), а итератор отдаёт следующий элемент через __next__() и в конце поднимает StopIteration. for, list(), sum(), in работают именно через этот протокол. Подробнее: протокол итерации.

python
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