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

Итератор (iterator) – это объект, который представляет поток данных. Повторяемый вызов метода __next__() (next() в Python 2) итератора или передача его встроенной функции next() возвращает последующие элементы потока.

Если больше не осталось данных, выбрасывается исключение StopIteration. После этого итератор исчерпан и любые последующие вызовы его метода __next__() снова генерируют исключение StopIteration.

Итераторы обязаны иметь метод __iter__, который возвращает сам объект итератора, так что любой итератор также является итерабельным объектом и может быть использован почти везде, где принимаются итерабельные объекты.

Подробнее:

Итераторы представлены абстрактным классом collections.abc.Iterator:

class Iterator(Iterable):

    __slots__ = ()

    @abstractmethod
    def __next__(self):
        'Return the next item from the iterator. When exhausted, raise StopIteration'
        raise StopIteration

    def __iter__(self):
        return self

    @classmethod
    def __subclasshook__(cls, C):
        if cls is Iterator:
            return _check_methods(C, '__iter__', '__next__')
        return NotImplemented

__next__ Возвращает следующий доступный элемент и вызывает исключение StopIteration, когда элементов не осталось. __iter__ Возвращает self. Это позволяет использовать итератор там, где ожидается итерируемый объект, например for__subclasshook__ Проверяет наличие у класса метода __iter__ и __next__

Oct. 10, 2023, Источник

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

  • Это объект, который возвращает свои элементы по одному за раз.
  • Любой объект, у которого есть метод __next__. Этот метод возвращает следующий элемент, если он есть, или возвращает исключение StopIteration, когда элементы закончились.
  • Кроме того, итератор запоминает, на каком элементе он остановился в последнюю итерацию.
  • В Python у каждого итератора присутствует метод __iter__ - то есть, любой итератор является итерируемым объектом. Этот метод просто возвращает сам итератор

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

  1. Чтобы получить итератор мы должны передать функции iter итерируемый объект.
  2. Далее мы передаём итератор функции next.
  3. Когда элементы в итераторе закончились, порождается исключение StopIteration.
numbers = [1, 2, 3]
i = iter(numbers)

next(i) # 1
next(i) # 2
next(i) # 3

Traceback (most recent call last):
  File "main.py", line 8, in <module>
    print(next(i))
StopIteration

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

  • После того, как элементы закончились, возвращается исключение StopIteration.
  • Итератор не может быть использован дважды. Для того, чтобы итератор снова начал возвращать элементы, его надо заново создать.

Аналогичные действия выполняются, когда цикл for проходится по списку, функция next() вызывается неявно:

for item in numbers:
   print(item)
  • Генераторы — это тоже итераторы.
  • Многие встроенные функции является итераторами, например zip , open

Плюсы итераторов:

  1. Итераторы работают "лениво" (en. lazy). А это значит, что они не выполняют какой-либо работы, до тех пор, пока мы их об этом не попросим.
  2. Таким образом, мы можем оптимизировать потребление ресурсов ОЗУ и CPU, а так же создавать бесконечные последовательности.

Oct. 10, 2023, Источник