Stepik: Итератор и итерируемые объекты. Функции iter и next
Существует универсальный механизм для перебора всех элементов итерируемого объекта (список или строка).
Реализуется он через специальную конструкцию под названием Итератор. То есть каждый итерируемый объект предоставляет доступ к своим элементам через Итератор.
Функция iter()
- используется для однократного перебора итерируемого объекта
d = [5, 3, 7, 10, 32] it = iter(d) # функция iter() - это итератор для однократного перебора списка print(it) # Вывод: <list_iterator object at 0x000002100B2895D0>
Функция next()
является полезным инструментом для пошагового перебора элементов в Python.
d = [5, 3, 7, 10, 32] it = iter(d) # функция iter() - это итератор для однократного перебора списка print(next(it)) # Вывод: 5 print(next(it)) # Вывод: 3 print(next(it)) # Вывод: 7
s = 'python' it = iter(s) print(next(it)) # Вывод: p print(next(it)) # Вывод: y print(next(it)) # Вывод: t print(next(it)) # Вывод: h print(next(it)) # Вывод: o print(next(it)) # Вывод: n print(next(it)) # Вывод: StopIteration - когда закончился итерируемый объект
Обращение к элементу по индексу и через итератор - 2 разных способа.
r = range(5) it = iter(r) print(next(it)) # Вывод: 0 print(next(it)) # Вывод: 1 print(next(it)) # Вывод: 2 print(next(it)) # Вывод: 3 print(next(it)) # Вывод: 4 print(next(it)) # Вывод: StopIteration
Но если нам в программе нужно перебирать итерируемые объекты самых разных типов, то единственный универсальный и безопасный способ это сделать – использовать итераторы. Например, так происходит в операторе цикла for
. Мы можем ему указать перебрать любой итерируемый объект и он должен «уметь» это делать вне зависимости от типа этого объекта. Поэтому он обращается к итератору и перебирает элементы через этот универсальный механизм, пока не возникнет исключение StopIteration
. Именно поэтому мы в цикле можем с легкостью перебирать и списки
В Python не все объекты являются итерируемыми.
print(iter(5)) Вывод: 'int' object is not iterable - потому что число - не итерируемый объект
Если 5 поместить список, тогда проблем не будет
print(iter([5])) # Вывод: StopIteration print(next(iter([5]))) # Вывод: 5