Ітератори в 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)
В цьому відео поговоримо про ітератори та генератори.