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