__iter__
или __getitem__
, которые возвращают итераторы или могут принимать индексы (подробности здесь). В итоге итерируемый объект это объект, который может предоставить нам итератор. Так что же представляет из себя итератор?next
(Python 2) или __next__
. Вот и все. Это итератор. Теперь об итерации.for
или любой другой функцией или конструкцией, которые позволяют итерировать по объекту. В большинстве случаев генераторы создаются как функции. Тем не менее, они не возвращают значение также как функции (т.е. через return
), в генераторах для этого используется ключевое слово yield
. Вот простой пример функции-генератора:списки
в Python 2, были модифицированы, для того, чтобы возвращать генераторы
в Python 3, поскольку последние требуют меньше ресурсов.генератора
, который считает числа Фибоначчи:next()
. Она позволяет нам переходить к следующему элементу коллекции. Давайте проверим наше понимание:next()
начала вызывать исключение StopIteration
. По сути, эта ошибка информирует нас о том, что все значения коллекции уже были пройдены. Может возникнуть вопрос, почему мы не получаем ошибку при использовании цикла for
. И ответ довольно прост. Цикл for
автоматически перехватывает данное исключение и перестает вызывать next
. Знали ли вы, что несколько встроенных типов данных в Python поддерживают итерирование? Давайте посмотрим:str
не итератор. И это действительно так! Строка - итерируемый объект, но не итератор. Т.е. она поддерживает итерирование, но мы не можем делать это напрямую. Так как же нам в конечном итоге итерировать по строке? Пришло время для очередной встроенной функции - iter
. Она возвращает итератор из итерируемого объекта. int
не является итерируемым объектом, однако мы можем использовать iter
со строками!