Ітератори – це методи, які виконують ітерацію колекцій, таких як списки, кортежі тощо. Використовуючи ітератор, ми можемо перебирати об’єкти та повертати їх елементи. Технічно, об’єкт ітератора в Python повинен визначати два спеціальні методи, __iter__() і __next__(), які в сукупності називаються протоколом ітератора.
Наприклад, функція iter() повертає ітератор заданого об’єкта:
|
1 |
iter(об'єкт) |
Аргументом функції iter() повинен бути будь-який об’єкт, який підтримує протокол ітерації чи послідовності. Коли ми викликаємо функцію iter() для певного об’єкта, функція спочатку шукає метод __iter__() цього об’єкта.
Якщо метод __iter__() існує, функція iter() викликає його для отримання ітератора. В протилежному випадку функція iter() шукає метод __getitem__().
Якщо метод __getitem__() існує, функція iter() створює об’єкт ітератора і повертає його. Якщо цей метод не існує, то генерується виняток TypeError.
Використання ітераторів в Python
В Python ми можемо використовувати функцію next() для повернення наступного елемента у послідовності. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Визначаємо список my_list = [4, 7, 0] # Створюємо ітератор зі списку iterator = iter(my_list) # Отримуємо перший елемент ітератора та виводимо його на екран print(next(iterator)) # Отримуємо другий елемент ітератора та виводимо його на екран print(next(iterator)) # Отримуємо третій елемент ітератора та виводимо його на екран print(next(iterator)) |
Результат:
4
7
0
Тут ми спочатку створили ітератор зі списку за допомогою функції iter(). Потім використали функцію next() для отримання елементів ітератора в послідовному порядку. Коли ми дійдемо до кінця і більше не буде даних для повернення, згенерується виняток StopIteration.
Автоматична ітерація
Елегантніший спосіб виконання автоматичної ітерації — використання циклу for. Наприклад:
|
1 2 3 4 5 |
# Визначаємо список my_list = [4, 7, 0] for element in my_list: print(element) |
Результат:
Ітератори та цикл for
Цикл for в Python використовується для ітерації по послідовності елементів, таких як список, кортеж або рядок. Коли ми використовуємо цикл for з ітератором, цикл автоматично перебиратиме елементи ітератора до тих пір, поки вони не закінчаться. Наприклад:
|
1 2 3 4 5 6 7 8 9 10 11 |
# Створюємо список цілих чисел my_list = [1, 2, 3, 4, 5] # Створюємо ітератор зі списку iterator = iter(my_list) # Перебираємо елементи ітератора for element in iterator: # Виводимо кожен елемент на екран print(element) |
Результат:
1
2
3
4
5
Цикл for виконує ітерацію по елементах об’єкта iterator. На кожній ітерації цикл присвоює значення наступного елемента змінній element, а потім виводить її на екран. Цей процес триває доти, доки в ітераторі не закінчаться елементи.
Створення користувацьких ітераторів в Python
Створити ітератор з нуля у Python дуже просто. Для цього потрібно визначити методи __iter__() та __next__():
__iter__() — повертає сам об’єкт ітератора. За потреби можна виконати ініціалізацію.
__next__() — повертає наступний елемент у послідовності. Після досягнення кінця та при наступних викликах (після кінця) генерується виняток StopIteration.
Розглянемо приклад програми піднесення значень до степеня на кожній ітерації. Показник степеня починається з нуля до встановленого користувачем числа.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
class PowTwo: def __init__(self, max=0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration # Створюємо об'єкт numbers = PowTwo(3) # Створюємо ітератор з об'єкта i = iter(numbers) # Використовуємо next для переходу до наступного елемента ітератора print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i)) # генерується виняток StopIteration |
Результат:
1
2
4
8
Traceback (most recent call last):
File "", line 32, in
File "", line 18, in __next__
StopIteration
Ми також можемо використовувати цикл for для ітерації по нашому класу:
|
1 2 |
for i in PowTwo(3): print(i) |
Результат:
1
2
4
8
Нескінченні ітератори в Python
Нескінченний ітератор – це ітератор, який ніколи не закінчується. Це означає, що він продовжуватиме створювати елементи необмежену кількість разів.
Ось приклад створення нескінченного ітератора в Python за допомогою функції count() з модуля itertools:
|
1 2 3 4 5 6 7 8 |
from itertools import count # Створюємо нескінченний ітератор, який починається з 1 і збільшується на 1 кожного разу infinite_iterator = count(1) # Виводимо перші 5 елементів нескінченного ітератора for i in range(5): print(next(infinite_iterator)) |
Результат:
1
2
3
4
5
Тут ми створили нескінченний ітератор, який починається з 1 і щоразу збільшується на 1. А потім ми вивели перші 5 елементів нескінченного ітератора за допомогою циклу for та функції next().
