Ответ
В Python важно различать понятия итерируемый объект (iterable) и итератор (iterator).
Итерируемый объект (Iterable) — это любой объект, из которого можно получить итератор. К ним относятся все последовательности (list
, tuple
, str
), а также dict
, set
и другие. Главный признак — наличие метода __iter__()
.
Итератор (Iterator) — это объект, который непосредственно осуществляет перебор элементов. Он реализует протокол итератора, который включает два метода:
__iter__()
— возвращает сам объект-итератор. Это позволяет использовать итераторы там, где ожидаются итерируемые объекты (например, в циклеfor
).__next__()
— возвращает следующий элемент последовательности. Если элементы закончились, вызывает исключениеStopIteration
.
Проще говоря: итерируемый объект — это как книга, а итератор — это закладка в этой книге, которая помнит, на какой странице вы остановились.
Как это работает:
Функция iter()
вызывается для итерируемого объекта, чтобы создать итератор. Функция next()
используется для получения следующего элемента из итератора.
Пример:
# numbers - это итерируемый объект (iterable)
numbers = [10, 20, 30]
# Создаем итератор из итерируемого объекта
number_iterator = iter(numbers)
# number_iterator - это итератор (iterator)
# Он помнит свое состояние
print(next(number_iterator)) # Вывод: 10
print(next(number_iterator)) # Вывод: 20
print(next(number_iterator)) # Вывод: 30
# Попытка получить следующий элемент вызовет StopIteration
# next(number_iterator)
# Цикл for под капотом делает то же самое:
# 1. Вызывает iter() для объекта
# 2. В каждой итерации вызывает next()
# 3. Перехватывает StopIteration для завершения цикла