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)
Спробуйте самі »
Цикл 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))
Спробуйте самі »
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)
Спробуйте самі »