Итераторы¶
Что такое итератор¶
С точки зрения 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
выражение.