Что такое итератор в Python и чем он отличается от итерируемого объекта

Ответ

В Python важно различать понятия итерируемый объект (iterable) и итератор (iterator).

Итерируемый объект (Iterable) — это любой объект, из которого можно получить итератор. К ним относятся все последовательности (list, tuple, str), а также dict, set и другие. Главный признак — наличие метода __iter__().

Итератор (Iterator) — это объект, который непосредственно осуществляет перебор элементов. Он реализует протокол итератора, который включает два метода:

  1. __iter__() — возвращает сам объект-итератор. Это позволяет использовать итераторы там, где ожидаются итерируемые объекты (например, в цикле for).
  2. __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 для завершения цикла