Итерация в 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)

iter(iterator)iterator

Если можно перебрать с помощью forin - значит итерируемый объект

Если можно применить 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
Протоколы
Генераторы

РЕКЛАМА хостинга Beget, которым я пользуюсь более десяти лет

Изображение баннера

Конец рекламы хостинга Beget, который я всем рекомендую.

Поиск по сайту

Подпишитесь на Telegram канал @aofeed чтобы следить за выходом новых статей и обновлением старых

Перейти на канал

@aofeed

Задать вопрос в Телеграм-группе

@aofeedchat

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящую по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: