Перейти к содержанию

Итераторы

Что такое итератор

С точки зрения Python - это любой объект, у которого есть метод __next__. Этот метод возвращает следующий элемент, если он есть, или возвращает исключение StopIteration, когда элементы закончились.

Итератор запоминает, на каком объекте он остановился в последнюю итерацию.

В Python у каждого итератора присутствует метод __iter__ - то есть, любой итератор является итерируемым объектом. Этот метод просто возвращает сам итератор.

Пример создания итератора из списка

numbers = [1, 2, 3]
i = iter(numbers)

Пример класса итератора

class PowTwo:

    def __init__(self, max: int = 0):
        self.max = max

    def __iter__(self):
        self.n = 0
        return self

    def __next__(self):
        if self.n <= self.max:
            result = 2 ** self.n
            self.n += 1
            return result
        else:
            raise StopIteration

Использование next()

Можно получить следующий элемент итератора используя функцию next(), которая вызывает метод __next__, чтобы взять следующий элемент:

next(i)
>>> 1
next(i)
>>> 2
next(i)
>>> 3
next(i)
StopIteration 
После того, как элементы закончились, возвращается исключение StopIteration.

Работа с циклами

Аналогичные действия выполняются, когда цикл for проходится по списку.

Когда мы перебираем элементы списка, к списку сначала применяется функция iter(), чтобы создать итератор, а затем вызывается его метод __next__ до тех пор, пока не возникнет исключение StopIteration.

Различие между итератором и генератором

Генератор является итератором, но не каждый итератор - генератор. Генератор является подтипом итератора и создается путем создания функции, которая имеет как минимум одно yield выражение.