Python итератор

Python итератор

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

Итератор является итерируемым объектом, что означает, что можно итерировать все значения.

Технически в Python, итератор является объектом, реализующим протокол итератора, который содержит методы __iter__() и __next__.

Итератор VS Итерируемый объект (Iterable)

список, кортеж, словарь и множество являются итерируемыми объектами. Они итерируемые контейнеры, из которых можно получить итератор (Iterator).

Все эти объекты имеют метод для получения итератора iter() Метод:

Пример

Возвратить из кортежа итератор и напечатать каждый значений:

mytuple = ("apple", "banana", "cherry")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))

Запуск примера

Даже строка является итерируемым объектом и может возвращать итератор:

Пример

Строка также является итерируемым объектом, которая содержит ряд символов:

mystr = "banana"
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))

Запуск примера

Итерация по итератору

Мы также можем использовать цикл for для итерации по итерируемому объекту:

Пример

Итерировать значения кортежа:

mytuple = ("apple", "banana", "cherry")
for x in mytuple:
  print(x)

Запуск примера

Пример

Итерировать символы строки:

mystr = "banana"
for x in mystr:
  print(x)

Запуск примера

Совет:Цикл for на самом деле создает объект итератора и выполняет его для каждого выполнения цикла next метод.

создание итератора

Чтобы создать объект/класс в качестве итератора, необходимо реализовать метод __iter__() и __next__ метод.

Как вы узнали в главе о классах/объектах Python, все классы имеют метод с именем __init__() Функция, которая позволяет выполнить一些 инициализации при создании объекта.

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

__next__ Метод также позволяет выполнять действия и должен возвращать следующий элемент из последовательности.

Пример

Создайте итератор, который возвращает числа, начинающиеся с 1, и каждый следующий элемент увеличивается на 1 (возврат 1, 2, 3, 4, 5 и т.д.):

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
  def __next__(self):
    x = self.a
    self.a += 1
    return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

Запуск примера

StopIteration

Если у вас есть достаточный next утверждение, или использовать его в цикле for, то в примере итерация будет продолжаться бесконечно.

Чтобы предотвратить бесконечное итерирование, мы можем использовать StopIteration утверждение.

в __next__ В методе, если итерация завершена指定的 количество раз, мы можем добавить终止ное условие для вызова ошибки:

Пример

Остановиться после 20 итераций:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
  print(x)

Запуск примера