Итерация в Python
Введение | |
Iteration Protocols | |
Итераторы и итерируемые объекты | |
Пример | |
StopIteration | |
Похожие статьи |
Введение
Итерация в
программировании
— в широком смысле — организация обработки данных, при которой действия повторяются многократно,
не приводя при этом к вызовам самих себя (в отличие от рекурсии).
В узком смысле — один шаг итерационного, циклического процесса.
Когда какое-то действие необходимо повторить большое количество раз, в программировании
используются циклы.
Например, нужно вывести 200 раз на экран текст «Hello, World!».
Вместо двухсоткратного повторения одной и той же команды вывода текста часто создается
цикл
,
который повторяется 200 раз и 200 раз выполняет то, что написано в теле цикла.
Iteration Protocols
iterable | iterator |
---|---|
Итерируемый объект - то есть объект, который может быть превращён в итератор | Итератор - то есть объект по которому возможна итерация |
Может быть передан в iter() чтобы создать iterator | Может быть передан в next() чтобы получить следующее значение в последовательности |
Итераторы и итерируемые объекты
Итерируемый объект (iterable) это такой объект, по которому возможна итерация. То есть
его элементы можно перебирать один за другим.
Если итерируемый объект ещё не является итератором (iterator), то его можно сделать итератором,
применив к нему функцию iter().
Итератор (iterator) это итерируемый объект, который можно передать в функцию next() чтобы получить следующий элемент последовательности (sequence)
iter(iterable) → iterator
next(iterator)
iter(iterator) → iterator
Если можно перебрать с помощью for … in - значит итерируемый объект
Если можно применить next() - значит итератор.
Все итераторы являются итерируемыми объектами.
iter(itetator) возвращает тот же самый iterator
iterator не содежит информации о том сколько в нём элементов
Объект | Итерируемый? | Итератор? |
---|---|---|
Итерируемый | ✔ | ? |
Итератор | ✔ | ✔ |
Генератор | ✔ | ✔ |
Список | ✔ | ✖ |
Наглядная демонстрация кода
Если some_iterable это итерируемый объект, то следующий код имеет смысл.
for item in some_iterable: print(item) next(iter(some_iterable)) # Если some_iterable пустой будет ошибка iter(iter(some_iterable))
Последовательности
Отдельно можно выделить итерируемые объекты, которые являются последовательностями (Sequences)
Это
списки
,
кортежи
и
строки
Последовательность может быть проиндексирована от 0 до последнего элемента. То есть имеет смысл следующий код:
a = my_sequence[0]
Многие типы объектов являются итерируемыми, но не являются последовательностями. Например: словари , множества , файлы , генераторы
Пример
Хороший пример итерируемого объекта - это список . Попробуем получать из него элементы по одному.
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
count()
Из itertools можно импортировать count который является итератором
>>> from itertools import count >>> c = count() >>> next(c) 0 >>> next(c) 1 >>> next(c) 2
Built-in Collections | |
Python | |
Протоколы | |
Генераторы |