Урок 27. Ітератори та генератори

Ітератори в Python — це об’єкти, які дозволяють перебирати елементи колекції (наприклад, списків, кортежів, словників, множин) по одному за раз. Вони реалізують протокол ітерації, що складається з двох методів: __iter__() і __next__(). Ітератори є корисними для економії пам’яті, оскільки вони генерують елементи на льоту, не зберігаючи всю колекцію в пам’яті. Приклад з відео:

#Ітератор - це об'єкт, 
#який містить підраховану кількість значень.
#Ітератор — це об’єкт, який можна повторювати, 
#тобто ви можете проходити через усі значення.
#У Python ітератор — це об’єкт, який реалізує 
#протокол ітератора, який складається 
#з методів __iter__() і __next__().
#Списки, кортежі, словники та множини
#є ітерабельними об’єктами.
str1 = "Text"
str1Iterator = iter(str1)
print(str1Iterator)
print(next(str1Iterator))
print(next(str1Iterator))
print(next(str1Iterator))
print(next(str1Iterator))
#print(next(str1Iterator))
list1 = ["Dodge", "Ford", "Toyota"]
list1Iterator = iter(list1)
print(list1Iterator)
print(next(list1Iterator))
print(next(list1Iterator))
print(next(list1Iterator))
for i in list1:
    print(i)

Для створення об’єкта чи класу як ітератора потрібно реалізувати в ньому методи __iter__() та __next__(). Приклад з відео:

#Щоб створити об’єкт/клас як ітератор, 
#вам потрібно реалізувати
#методи __iter__() і __next__() 
#для вашого об’єкта.
#Метод __iter__() завжди повинен 
#повертати сам об’єкт ітератора.
#Метод __next__() також дозволяє 
#виконувати операції, і має повернути 
#наступний елемент у послідовності.
class IncreaseByOne:
    def __iter__(self):
        self.num = 1
        return self
    def __next__(self):
        nextnum = self.num
        self.num += 1
        return nextnum
    
instance1 = IncreaseByOne()
iterator1 = iter(instance1)
print(next(iterator1))
print(next(iterator1))
print(next(iterator1))
print(next(iterator1))
print(next(iterator1))

Для уникнення нескінченного виконання ітепацій можна використати StopIteration. Приклад з відео:

#Щоб ітерація не тривала вічно, ми можемо 
#використати оператор StopIteration.
class IncreaseByOne:
    def __iter__(self):
        self.num = 1
        return self
    def __next__(self):
        if self.num<=10:
            nextnum = self.num
            self.num += 1
            return nextnum
        else:
            raise StopIteration
    
instance1 = IncreaseByOne()
iterator1 = iter(instance1)
for i in iterator1:
    print(i)

Генератори

Генератори — це простіший спосіб створення ітераторів. Вони використовують оператор yield, щоб повернути значення на льоту без необхідності реалізовувати методи __iter__() і __next__(). Приклад з відео:

#У Python генератор — це функція, 
#яка повертає ітератор
#Ми можемо визначити функцію генератора 
#за допомогою ключового слова def,
#але замість оператора return ми 
#використовуємо оператор yield.
#Ключове слово yield використовується 
#для створення значення з генератора.
#Коли викликається функція генератора, 
#вона не виконує тіло функції негайно. 
#Натомість він повертає об’єкт-генератор, 
#який можна повторити, щоб отримати значення.
def increaseByOneGenerator(n):
    num = 0
    while num<n:
        yield num
        num+=1
        
for i in increaseByOneGenerator(10):
    print(i)
print("---------------")
generator1 = increaseByOneGenerator(25)
print(next(generator1))
print(next(generator1))
print(next(generator1))
for i in generator1:
    print(i)

Приклад з відео із застосуванням спрощеного синтаксису для генераторів:

#expression for item in iterable
#Вираз-генератор створює об’єкт-генератор, 
#який виробляє значення виразу для кожного 
#елемента об’єкта, що повторюється, 
#по одному під час кожної ітерації.
squareGenerator = (num*num for num in range(10))
for i in squareGenerator:
    print(i)
Урок 27. Ітератори та генератори

В цьому відео поговоримо про ітератори та генератори.

Приклади на Github

Leave a Reply

Your email address will not be published. Required fields are marked *