Объекты Iterator в python соответствуют протоколу итератора, что в основном означает, что они предоставляют два метода: __iter__()
и next()
. __iter__
возвращает объект итератора и неявно вызывается в начале циклов. Метод next()
возвращает следующее значение и неявно вызывается при каждом приращении цикла. next()
вызывает исключение StopIteration, когда больше нет значения для возврата, которое неявно захватывается конструкциями цикла, чтобы остановить итерацию.
Вот простой пример счетчика:
class Counter:
def __init__(self, low, high):
self.current = low
self.high = high
def __iter__(self):
return self
def next(self): # Python 3: def __next__(self)
if self.current > self.high:
raise StopIteration
else:
self.current += 1
return self.current - 1
for c in Counter(3, 8):
print c
Это будет печатать:
3
4
5
6
7
8
Это проще записать с использованием генератора, как описано в предыдущем ответе:
def counter(low, high):
current = low
while current <= high:
yield current
current += 1
for c in counter(3, 8):
print c
Печатный вывод будет таким же. Под капотом объект-генератор поддерживает протокол итератора и делает что-то примерно похожее на класс Counter.
Статья Дэвида Мерца, Итераторы и простые генераторы - довольно хорошее введение.