Sobes.tech
Назад к вопросам
Junior — Middle
56

Каким образом реализовать механизм обхода элементов коллекции с помощью итератора?

Компании, где спрашивали
Вкусно и точкаВкусно и точка

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

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

Определение:

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

  • быть итерируемым: реализовывать __iter__();
  • либо сам быть итератором: реализовывать __iter__() и __next__().

При обходе Python вызывает __next__() до тех пор, пока не получит StopIteration, что означает конец последовательности.

Пример использования:

class MyRange:
    def __init__(self, start, stop):
        self.start = start
        self.stop = stop

    def __iter__(self):
        return MyRangeIterator(self.start, self.stop)


class MyRangeIterator:
    def __init__(self, current, stop):
        self.current = current
        self.stop = stop

    def __iter__(self):
        return self

    def __next__(self):
        if self.current >= self.stop:
            raise StopIteration
        value = self.current
        self.current += 1
        return value


numbers = MyRange(1, 4)

for n in numbers:
    print(n)

Пояснение кода:

  1. MyRange — это контейнер, который хранит границы диапазона.
  2. Метод __iter__() создаёт и возвращает отдельный объект-итератор MyRangeIterator.
  3. MyRangeIterator хранит текущее состояние обхода в self.current.
  4. Метод __next__():
    • проверяет, не достигнут ли конец;
    • если да, выбрасывает StopIteration;
    • если нет, возвращает текущее значение и сдвигает указатель вперёд.
  5. Конструкция for автоматически вызывает iter(numbers) и затем многократно вызывает next() до StopIteration.

Ключевые моменты:

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