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

 


Связанные темы