Протокол итератора в Python — это стандартный интерфейс, который позволяет объектам быть перебираемыми — например, в цикле for. Он основан на двух специальных методах: __iter__ и __next__.
__iter__Метод __iter__ делает объект перебираемым. Он возвращает сам объект итератора, который отвечает за выдачу значений по одному.
__next__Метод __next__ определяет какое значение возвращать на каждом шаге итерации. Каждый вызов возвращает следующее значение в последовательности. Когда больше нет значений для возврата, он должен выбросить исключение StopIteration, чтобы сигнализировать об окончании итерации.
Вот простой пример пользовательского итератора:
class Counter:
def __init__(self, limit):
self.limit = limit
self.current = 0
def __iter__(self):
return self # возвращает объект итератора
def __next__(self):
if self.current >= self.limit:
raise StopIteration # сигнализирует об окончании итерации
self.current += 1
return self.current
Когда используется в цикле for, Python под капотом один раз вызывает __iter__, чтобы получить итератор, а затем многократно вызывает __next__ для получения каждого значения до тех пор, пока не будет выброшено исключение StopIteration.
__iter__ обычно возвращает self, когда объект является своим собственным итераторомStopIteration — это стандартный сигнал завершения итерацииfor, list() и zip(), все опираются на этот протокол внутриМетод __iter__ всегда должен возвращать self, независимо от того, является ли объект собственным итератором или делегирует работу отдельному объекту итератора.
Новый — ещё не проверен сообществом
Вы