Итерация в 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)
Пример
Хороший пример итерируемого объекта - это список . Попробуем получать из него элементы по одному.
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
Built-in Collections | |
Python | |
Протоколы | |
Генераторы |