ENIGMA AI
ENIGMA AI

Что такое итератор?

встречается 7× junior data_structures

Как ответить

Итератор — это объект-посредник, который позволяет последовательно обходить элементы коллекции (списка, словаря, файла), не раскрывая её внутреннюю структуру. Проще говоря, это как закладка в книге: вы знаете, где остановились, и можете двигаться дальше, не перелистывая всю книгу заново.

В Python итератором считается любой объект, который реализует протокол итератора: метод __iter__() (возвращает сам итератор) и метод __next__() (возвращает следующий элемент или бросает исключение StopIteration, когда элементы закончились).

Вот как это выглядит в коде:

numbers = [10, 20, 30]
iterator = iter(numbers)  # получаем итератор

print(next(iterator))  # 10
print(next(iterator))  # 20
print(next(iterator))  # 30
print(next(iterator))  # StopIteration

Именно этот механизм стоит за циклом for item in collection. Когда вы пишете такой цикл, Python неявно вызывает iter(collection), получает итератор и на каждом шаге вызывает next(), пока не поймает StopIteration.

Важно различать итерируемый объект и итератор. Итерируемый объект (например, список) имеет метод __iter__(), который возвращает новый итератор. Сам итерируемый объект итератором не является — его можно обойти много раз. Итератор же — это одноразовый объект: после того, как вы дошли до конца, повторный вызов next() даст ошибку. Чтобы обойти коллекцию снова, нужно запросить новый итератор.

Итераторы экономят память: они не загружают все элементы в оперативную память сразу, а выдают их по одному по запросу. Классический пример — range(1000000) в Python 3: это итератор, который генерирует числа на лету, а не хранит список из миллиона чисел.

На собеседовании стоит также упомянуть, что итераторы могут быть бесконечными (например, itertools.cycle) и что любой генератор, написанный через yield, автоматически является итератором.

Ключевые тезисы

  • Итератор — это объект с методами __iter__() и __next__(), который выдаёт элементы по одному.
  • Цикл for неявно использует итератор: вызывает iter() и next() до StopIteration.
  • Итерируемый объект (коллекция) и итератор — разные вещи: коллекцию можно обойти много раз, итератор — только один.
  • Итераторы экономят память, работая лениво (lazy evaluation), например range() или генераторы.

Что спросят дальше

  • — Чем итератор отличается от генератора?
  • — Можно ли сделать итератор на своём классе? Если да, то как именно?
  • — Что произойдёт, если вызвать next() на итераторе, который уже закончился?

Готовьтесь к собеседованию с ENIGMA AI

AI-суфлёр подсказывает ответы прямо на собеседовании в реальном времени — незаметно для интервьюера.

Скачать приложение