Итерация в Python

Содержание
Введение
Iteration Protocols
Итераторы и итерируемые объекты
Пример
StopIteration
Похожие статьи

Введение

Итерация в программировании — в широком смысле — организация обработки данных, при которой действия повторяются многократно, не приводя при этом к вызовам самих себя (в отличие от рекурсии).

В узком смысле — один шаг итерационного, циклического процесса.

Когда какое-то действие необходимо повторить большое количество раз, в программировании используются циклы.

Например, нужно вывести 200 раз на экран текст «Hello, World!».

Вместо двухсоткратного повторения одной и той же команды вывода текста часто создается цикл , который повторяется 200 раз и 200 раз выполняет то, что написано в теле цикла.

Iteration Protocols

Iteration Protocols
iterable iterator
Итерируемый объект - то есть объект, который может быть превращён в итератор Итератор - то есть объект по которому возможна итерация
Может быть передан в iter() чтобы создать iterator Может быть передан в next() чтобы получить следующее значение в последовательности

Итераторы и итерируемые объекты

Итерируемый объект (iterable) это такой объект, из которого можно сделать итератор (iterator), применив к нему функцию iter().

Итератор (iterator) это объект, который можно передать в функцию next() чтобы получить следующий элемент последовательности (sequence)

iter(iterable)iterator

next(iterator)

Пример

Хороший пример итерируемого объекта - это список . Попробуем получать из него элементы по одному.

iterable = ['Benalmadena', 'Cordoba', 'Fuengirola', 'Malaga'] print(type(iterable)) print(next(iterable))

python iterable_ex.py

<class 'list'> Traceback (most recent call last): File "/home/andrei/iterable_ex.py", line 2, in <module> print(next(iterable)) TypeError: 'list' object is not an iterator

Как видите, класс list не позволяет напрямую итерировать по его элементам.

Воспользуемся функцией iter()

iterable = ['Benalmadena', 'Cordoba', 'Fuengirola', 'Malaga'] iterator = iter(iterable) print(next(iterator)) print(next(iterator)) print(next(iterator)) print(next(iterator)) print(next(iterator))

python iterable_ex.py

Benalmadena Cordoba Fuengirola Malaga Traceback (most recent call last): File "/home/andrei/iterable_ex.py", line 7, in <module> print(next(iterator)) StopIteration

После применения iter() мы смогли итерировать по списку до тех пор, пока его элементы не кончились.

def city(iterable): iterator = iter(iterable) try: return next(iterator) except StopIteration: raise ValueError("iterable is empty") # List print(city(["Benalmadena", "Cordoba", "Fuengirola", "Malaga"])) print(city(["Benalmadena", "Cordoba", "Fuengirola", "Malaga"])) # Set print(city({"Benalmadena", "Cordoba", "Fuengirola", "Malaga"})) print(city({"Benalmadena", "Cordoba", "Fuengirola", "Malaga"}))

python iterable_ex.py

Benalmadena Benalmadena Fuengirola Fuengirola

set не гарантирует порядок, поэтому вместо Fuengirola может быть любой город.

StopIteration

Пройдёмся по всему итератору и обработаем исключение StopIteration

cities = ['Benalmadena', 'Cordoba', 'Fuengirola', 'Malaga'] g = iter(cities) while True: try: print(next(g)) except StopIteration: raise ValueError("iterable is empty") finally: print("Printing!") print("Great Success!") # will not be printed

python iterable_ex2.py

Benalmadena Printing! Cordoba Printing! Fuengirola Printing! Malaga Printing! Printing! Traceback (most recent call last): File "/home/andrei/iterable_ex2.py", line 21, in <module> print(next(g)) StopIteration During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/andrei/iterable_ex2.py", line 23, in <module> raise ValueError("iterable is empty") ValueError: iterable is empty