Объекты-итераторы. Использование итераторов и генераторов для списков. Функции 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
- Методы работы со списками. Примеры
⇑