Об’єкти-ітератори. Використання ітераторів та генераторів для списків. Функції range(), next(), iter()
Зміст
- 1. Що таке об’єкти-ітератори (ітеровані об’єкти)?
- 2. Що таке протокол ітерацій?
- 3. Що таке ітератори списків?
- 4. Використання функцій next() та iter() для обходу списку. Приклади
- 5. Використання функції __next__() для обходу списку. Приклад
- 6. Ручний та автоматичний способи виконання ітерацій. Приклад
- 7. Що таке генератори списків?
- 8. Приклад генерування списку на основі існуючого списку
- 9. Функція range(). Генерування списку. Приклади
- Зв’язані теми
Пошук на інших ресурсах:
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]
⇑
Зв’язані теми
- Списки. Властивості списків. Приклади, що демонструють властивості списків
- Операції над списками: конкатенація (+), дублювання (*), видалення, зріз, доступ за індексом
- Обробка списків у циклах. Створення списків з допомогою генераторів списків. Ітерації по списках. Представлення та обробка матриць з допомогою списків. Операція in
- Методи роботи зі списками. Приклади
⇑