Добрый, добрый Python
November 20, 2023

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

ТЕКСТ ЛЕКЦИИ