Итерирование по коллекции

Протокол итератора
Python реализует абстрактный слой, который реализует ряд протоколов для взаимодействия между объектами python независимо от их типа. Одним из таких протоколов является протокол итерирования. Протокол реализует некоторый набор правил и требований к объекту, если объект этим требованиям соответствует, то можно сказать что объект реализует данный протокол.

Итерирование - это процесс прохода по всем элементам коллекции данных.

Протокол итерирования делает возможным циклу for работать с самыми разными коллекциями единообразно. Для того чтобы объект удовлетворял протоколу итерирования, он должен обладать методом __iter__()

Итератор - это объект, который при каждом вызове возвращает очередной элемент, а после исчерпания всех элементов возбуждает исключение StopIteration.

Причем сам по себе объект коллекции данных не является итератором, когда нужно проитерировать по этому объекту - то интерпретатор вызывает метод __iter__(), который уже возвращает объект итератора, каждый шаг итерации вызывает метод __next__(), чтобы получить следующий элемент коллекции, когда достигнут конец итератора возбуждается исключение StopIteration, оно перехватывается и итерирование завершается.

Протокол итерации поддерживают все коллекции данных, включая тип str. Порядок в котором будут возвращаться элементы зависит от типа итерируемого объекта, для списков и кортежей он будет строгим, для множеств и словарей случайным.

Операции и функции


Рассмотрим операции и функции, применяемые к итерируемым объектам.
Пусть:
iterable - итерируемый объект
obj - любой объект