Предыдущий урок: Классы и объекты Python
List, tuple, dict и sets — это все итерируемые объекты. Они являются итерируемыми контейнерами, из которых вы можете получить итератор. Все эти объекты имеют метод iter(), который используется для получения итератора.
 Получим итератор из кортежа и выведем каждое значение:
mytuple = ("яблоко", "банан", "вишня")
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
Вывод:
яблоко
банан
вишня
Даже строки являются итерируемыми объектами и могут возвращать итератор.
mystr = "банан"
myit =  iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
Вывод:
б
а
н
а
н
Цикл через итератор
Мы также можем использовать цикл for для итерации по итерируему объект.
mytuple = ("яблоко", "банан", "вишня") 
for x in mytuple:
    print(x)
Вывод:
яблоко
банан
вишня
Итерируйем символы строки:
mystr = "банан"
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))
Вывод:
1  
2  
3  
4  
5
StopIteration
Приведенный выше пример будет продолжаться вечно, пока вы вызываете оператор next() или если используете в цикле for. Чтобы итерация не продолжалась вечно, мы можем использовать оператор StopIteration.
В метод __next __() мы можем добавить условие завершения, чтобы вызвать ошибку, если итерация выполняется указанное количество раз:
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)
Вывод:
1  
2  
3  
...
18
19
20
Далее: Модули Python
 
  
 




