Какова роль специальных методов с двойным подчеркиванием в реализации итераторов в 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
Пояснение кода:
Код показывает простой пользовательский итератор.
__init__()сохраняет начальное и конечное значения.__iter__()возвращает сам объект, потому что он уже является итератором.__next__():- проверяет, не достигнут ли конец диапазона;
- если достигнут, выбрасывает
StopIteration; - иначе возвращает текущее значение и сдвигает состояние на следующий шаг.
- Цикл
forавтоматически вызывает__iter__(), затем многократно вызывает__next__(), пока не получитStopIteration.
Ключевые моменты:
__iter__()и__next__()— основа итерационного протокола Python.forработает не с конкретными коллекциями, а с этим протоколом.StopIteration— стандартный способ завершить итерацию.- Итератор хранит своё состояние и может “помнить”, на каком элементе остановился.
- Не каждый итерируемый объект является итератором: список итерируемый, но его итератор создаётся отдельно через
iter(). - Специальные методы вызываются Python автоматически, их обычно не вызывают вручную без необходимости.