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

Какова роль специальных методов с двойным подчеркиванием в реализации итераторов в Python?

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

sobes.tech AI

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

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

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

Специальные методы — это методы с именами вида __name__, которые Python вызывает неявно в ответ на операции языка. В контексте итераторов они определяют, как объект ведёт себя при переборе элементов.

  • __iter__() возвращает итератор.
  • __next__() возвращает следующий элемент последовательности.
  • Если элементы закончились, __next__() должен вызвать StopIteration.

Объект называется итератором, если у него есть __next__() и он сам возвращается из __iter__().

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

class Counter:
    def __init__(self, start, stop):
        self.current = start
        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


for number in Counter(1, 4):
    print(number)

Результат:

1
2
3

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

Код показывает простой пользовательский итератор.

  1. __init__() сохраняет начальное и конечное значения.
  2. __iter__() возвращает сам объект, потому что он уже является итератором.
  3. __next__():
    • проверяет, не достигнут ли конец диапазона;
    • если достигнут, выбрасывает StopIteration;
    • иначе возвращает текущее значение и сдвигает состояние на следующий шаг.
  4. Цикл for автоматически вызывает __iter__(), затем многократно вызывает __next__(), пока не получит StopIteration.

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

  • __iter__() и __next__() — основа итерационного протокола Python.
  • for работает не с конкретными коллекциями, а с этим протоколом.
  • StopIteration — стандартный способ завершить итерацию.
  • Итератор хранит своё состояние и может “помнить”, на каком элементе остановился.
  • Не каждый итерируемый объект является итератором: список итерируемый, но его итератор создаётся отдельно через iter().
  • Специальные методы вызываются Python автоматически, их обычно не вызывают вручную без необходимости.