Итераторы Python
Итераторы Python
Итератор — это объект, который содержит счетное количество значений.
Итератор — это объект, по которому можно выполнять итерацию, что означает, что вы можете пройти через все значения.
Технически, в Python итератор — это объект, реализующий протокол итератора, состоящий из методов __iter__()
и __next__()
.
Итератор против итерируемого
Списки, кортежи, словари и наборы — все это повторяемые объекты. Это итерируемые контейнеры , из которых вы можете получить итератор.
У всех этих объектов есть 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,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))
Остановить итерацию
Приведенный выше пример будет продолжаться вечно, если у вас будет достаточно операторов 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)