Об’єкти-ітератори. Використання ітераторів та генераторів для списків. Функції range(), next(), iter()

Об’єкти-ітератори. Використання ітераторів та генераторів для списків. Функції range(), next(), iter()


Зміст



1. Що таке об’єкти-ітератори (ітеровані об’єкти)?

Об’єкт-ітератор – це об’єкт, який відповідає наступним критеріям:

  • об’єкт є послідовністю, яка може бути фізичною чи віртуальною. Віртуальна послідовність формується за вимогою;
  • в поєднанні з циклом for об’єкт видає один результат (елемент) з послідовності.

До таких об’єктів відносяться списки, кортежі, рядки.

 

2. Що таке протокол ітерацій?

Протокол ітерацій – це така поведінка ітерованого об’єкту, при якій:

  • ітерований об’єкт реалізує метод __next__() для отримання наступного значення в послідовності;
  • після отримання серії результатів та для її закінчення, ітерований об’єкт генерує виключення StopIteration.

 

3. Що таке ітератори списків?

Ітератори списків – це об’єкти:

  • які підтримують можливість здійснення ітерацій по послідовностях;
  • які повертаються функцією iter() а також підтримують функцію next(). Робота цих функцій описується нижче.

Ітератори списків застосовуються до ітерованих об’єктів (об’єктів-ітераторів). Ітерованими об’єктами можуть бути списки, кортежі, рядки.

 

4. Використання функцій next() та iter() для обходу списку. Приклади

Функції next() та iter() призначені для ручного обходу списків.

Функція next() використовується для отримання наступного елементу в послідовності (в ітерованому об’єкті). Функція next() звертається до функції __next__() (див. п. 5).

Функція iter() призначена для отримання об’єкту-ітератора. Кожен об’єкт-ітератор має вбудований метод __next__().

Приклад 1. Обхід списку з допомогою функцій iter() та next().

# обхід списку з допомогою функцій iter() та next()
# заданий список
A = [ 3, 8, 12, 20 ]

# отримати об'єкт-ітератор для списку A
I = iter(A)
print("I = ", I)

# отримати поточне значення та перейти до наступного елементу послідовності
t = next(I) # t = 3
print("t = ", t)

# наступний елемент списку
t = next(I) # t = 8
print("t = ", t)

Результат виконання програми

I = <list_iterator object at 0x03DD1870>
t = 3
t = 8

Приклад 2. Читання текстового файлу.

Задано текстовий файл, в якому записані числа (або інша інформація). Файл розміщений на диску за шляхом

E:\1\myfile.txt

Нижче наведений програмний код читання інформації з файлу з допомогою функцій iter() та next().

# читання з файлу з допомогою функцій iter() та next()
# заданий файл e:\1\myfile.txt
fp = open('e:\\1\\myfile.txt')

# прочитати файл з допомогою циклу while
I = iter(fp) # отримати ітератор

# цикл виведення на екран рядків у файлі
while True:
    try:
        t = next(I) # спроба взяти наступний рядок у файлі
    except:
        StopIteration # зупинити ітерації, якщо кінець файлу
        break

print(t, end='') # вивести рядок

Результатом виконання програми буде вивід вмісту файлу. Для коректного завершення читання файлу, використовується блок try…except.

У функції print(), якщо забрати рядок

end=''

то в кожному рядку при виведенні файлу буде додаватись зайвий новий рядок.

 

5. Використання функції __next__() для обходу списку. Приклад

Функція __next__() використовується для обходу списку так само як і функція next(). Функція __next__() застосовується для ітерованого об’єкту.

У прикладі демонструється обхід списку з допомогою функції __next__(). Для створення об’єкта-ітератора викликається функція iter().

# обхід списку з допомогою функцій iter() та next()
# заданий список
A = [ 'abc', 'AAA', 'BBB' ]

# отримати об'єкт-ітератор для списку A
IA = iter(A)
print("IA = ", IA)

# вивести поточне значення та перейти до наступного елементу списку
t = IA.__next__() # t = 'abc'
print("t = ", t)

# наступний елемент списку
t = IA.__next__()
print("t = ", t) # t = 'AAA'

# наступний елемент
t = IA.__next__()
print("t = ", t) # t = 'BBB'

# спроба взяти наступний елемент, якого немає в списку
t = IA.__next__() # виключення StopIteration
print("t = ", t)

У результаті виконання програми буде отримано наступний результат

IA = <list_iterator object at 0x040D7850>
t = abc
t = AAA
t = BBB
Traceback (most recent call last):
File "C:\Users\user\AppData\Local\Programs\Python\Python37-32\Lists04.py", line 23, in <module>
    t = IA.__next__()
StopIteration

Як видно з результату, спроба викликати неіснуючий елемент списку викликає виключення StopIteration.

 

6. Ручний та автоматичний способи виконання ітерацій. Приклад

Ітерації в послідовності можна виконувати ручним або автоматичним способами. Автоматичний спосіб передбачає застосування циклу for. Для організації ручного способу виконання ітерацій використовується цикл while.

В автоматичному способі отримання ітератора функцією iter(), приріст ітератора функцією next() та обробка виключення StopIteration здійснюються автоматично.

В ручному способі в циклі while обробка послідовності здійснюється з допомогою блоку try…except. Цей блок виконує операцію та перехоплює виключення, які можуть виникнути.

Приклад організації автоматичного та ручного способів виконання ітерацій для заданого списку

# ручний та автоматичний спосіб виконання ітерацій
# заданий список
A = [ 2, 3, 5, 7, 15 ]

# автоматичний спосіб виконання ітерацій
print("Автоматичний спосіб:")
for t in A:
    print(t*t)

# ручний спосіб
print("\nРучний спосіб:")
I = iter(A) # отримати ітератор для списку A

while True:
    try:
        t = next(I) # те саме що й I.__next__()
    except StopIteration:
        break

print(t**3)

Результат виконання програми:

Автоматичний спосіб:
4
9
25
49
225

Ручний спосіб:
8
27
125
343
3375

 

7. Що таке генератори списків?

Генератори списків – це засоби, які дозволяють формувати списки на основі заданого виразу чи правила використовуючи протокол ітерацій.

З допомогою генераторів, списки можуть утворюватись:

  • на основі раніше створених списків;
  • з використанням вбудованих засобів Python, наприклад функції range().

 

 8. Приклад генерування списку на основі існуючого списку

У прикладі на основі існуючого списку A формується інший список B. Кожен елемент списку B множиться на значення 2.2.

# генератор списку
# створити список парних чисел від 0 до 10
A = [ 2, 4, 6, 8, 10 ]

# на основі даних списку A утворити інший список
B = [ t*2.2 for t in A ]
print("A = ", A)
print("B = ", B)

У вищенаведеному прикладі, в рядку

B = [ t*2.2 for t in A ]

з списку A послідовно витягується елемент за елементом. Отриманий елемент записується в об’єкт t. Перед ключовим словом for вказується формула утворення нового списку

t*2.2

На основі даного зразка можна створювати власні нові списки беручи за основу інші, раніше створені списки.

Результат виконання програми

A = [2, 4, 6, 8, 10]
B = [4.4, 8.8, 13.200000000000001, 17.6, 22.0]

 

9. Функція range(). Генерування списку. Приклади

Для генерування списків використовуються вбудовані функції Python. Поширеною функцією генерування послідовностей є функція range().

Функція range() може отримувати від 1 до 3 параметрів. В залежності від кількості параметрів, функція формує діапазон цілих чисел за відповідними правилами. Нижче наведено особливості функції range() в залежності від кількості отримуваних параметрів:

  • 1 параметр – цей параметр вказує значення максимального елементу в послідовності (верхня межа). Мінімальним елементом в послідовності є 0. Якщо в якості параметра вказати від’ємне значення, то то функція повертає пусту послідовність. Крок між сусідніми елементами послідовності рівний 1;
  • 2 параметри. Перший параметр вказує найменший елемент в послідовності. Другий параметр вказує найбільший елемент в послідовності. Крок між сусідніми елементами послідовності рівний 1;
  • 3 параметри. Перші два параметри вказують відповідно найменший та найбільший елементи послідовності. Третій параметр вказує крок зміни при формуванні наступного елементу послідовності.

Приклад 1. Генерування списку цілих чисел функцією range().

# генератори списків
# 1. Згенерувати список чисел, крок зсуву = 1
A = list(range(-5,5)) # A = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]

# 2. Згенерувати список з 5 чисел на інтервалі [0,10] з кроком 2
B = list(range(0,10,2)) # B = [0, 2, 4, 6, 8]

print("A = ", A)
print("B = ", B)

Результат виконання програми

A = [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]
B = [0, 2, 4, 6, 8]

Приклад 2. Зміна списку з використанням функції range().

# зміна списку з допомогою функції range()
# сформувати список
A = list(range(10,50,5))
print("A = ", A)

# змінити список - подвоїти кожен елемент списку
for i in range(len(A)):
    A[i]*=2
print("A*2 = ", A)

Результат виконання програми

A = [10, 15, 20, 25, 30, 35, 40, 45]
A*2 = [20, 30, 40, 50, 60, 70, 80, 90]

Приклад 3. Використання функції range(), яка отримує один параметр.

# функція range() з одним параметром
# створити список чисел від 1 до 10
A = list(range(10)) # A = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print("A = ", A)

Результат виконання програми

A = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

 


Зв’язані теми