В чем разница между итерируемым объектом и итератором в Python

Ответ

Это два разных, но связанных понятия в протоколе итерации Python.

  • Итерируемый объект (Iterable) Это любой объект, который может вернуть итератор. Он определяет метод __iter__(), который возвращает новый объект-итератор. Итерируемые объекты можно использовать в цикле for ... in .... Примеры: списки (list), кортежи (tuple), строки (str), словари (dict).

  • Итератор (Iterator) Это объект, который представляет поток данных и управляет процессом итерации. Он определяет метод __next__(), который возвращает следующий элемент и вызывает исключение StopIteration, когда элементы заканчиваются. Итератор также должен иметь метод __iter__(), возвращающий самого себя.

Ключевое отличие

Итерируемый объект — это "источник" данных, а итератор — это "помощник", который отслеживает текущую позицию при переборе этих данных.

Характеристика Итерируемый объект (Iterable) Итератор (Iterator)
Основной метод __iter__() __next__() и __iter__()
Состояние Не хранит состояние итерации Хранит состояние (текущий элемент)
Назначение Предоставить данные для перебора Управлять процессом перебора

Практический пример

Цикл for в Python неявно выполняет следующие шаги:

  1. Вызывает iter() у итерируемого объекта (my_list), чтобы получить итератор.
  2. В каждой итерации вызывает next() у итератора, чтобы получить следующий элемент.
  3. Перехватывает исключение StopIteration для завершения цикла.
# 1. Итерируемый объект (источник данных)
my_list = [10, 20, 30]

# 2. Получение итератора из итерируемого объекта
my_iterator = iter(my_list) 

# my_iterator - это итератор, он хранит состояние
# type(my_list) -> <class 'list'>
# type(my_iterator) -> <class 'list_iterator'>

# 3. Ручной перебор с помощью итератора
print(next(my_iterator))  # Вывод: 10
print(next(my_iterator))  # Вывод: 20
print(next(my_iterator))  # Вывод: 30

# Следующий вызов вызовет исключение StopIteration
# print(next(my_iterator)) # -> StopIteration

Таким образом, любой итератор является итерируемым объектом, но не наоборот.