Итераторы¶
Что такое итератор¶
С точки зрения Python - это любой объект, у которого есть метод __next__. Этот метод возвращает следующий элемент, если он есть, или возвращает исключение StopIteration, когда элементы закончились.  
Итератор запоминает, на каком объекте он остановился в последнюю итерацию.
В Python у каждого итератора присутствует метод __iter__ - то есть, любой итератор является итерируемым объектом. Этот метод просто возвращает сам итератор.
Пример создания итератора из списка¶
Пример класса итератора¶
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__, чтобы взять следующий элемент:
Работа с циклами¶
Аналогичные действия выполняются, когда цикл for проходится по списку.
Когда мы перебираем элементы списка, к списку сначала применяется функция iter(), чтобы создать итератор, а затем вызывается его метод __next__ до тех пор, пока не возникнет исключение StopIteration.
Различие между итератором и генератором¶
Генератор является итератором, но не каждый итератор - генератор. Генератор является подтипом итератора и создается путем создания функции, которая имеет как минимум одно yield выражение.