Что должно присутствовать у объекта, чтобы он был итератором в Python?
Answer from AI
sobes.tech AI
Что хотят услышать интервьюеры:
Итератор в Python — это объект, который умеет последовательно возвращать элементы по одному. У него должны быть методы __iter__() и __next__(). Важно также понимать, что итератор сам себя возвращает из __iter__() и выбрасывает StopIteration, когда элементы закончились.
Определение:
Итератор — это объект, по которому можно проходить в цикле, получая элементы по одному без хранения всей последовательности в памяти.
Чтобы объект считался итератором, он должен:
- реализовывать метод
__iter__(), возвращающий сам объект; - реализовывать метод
__next__(), который возвращает следующий элемент; - при завершении последовательности поднимать исключение
StopIteration.
При этом любой итератор является итерируемым объектом, но не любой итерируемый объект является итератором.
Пример использования:
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
raise StopIteration
value = self.data[self.index]
self.index += 1
return value
it = MyIterator([10, 20, 30])
for x in it:
print(x)
Пояснение кода:
В этом примере класс MyIterator хранит список и текущую позицию.
__iter__()возвращаетself, поэтому объект можно использовать вfor.__next__()возвращает текущий элемент и сдвигает индекс.- Когда элементы заканчиваются, вызывается
StopIteration, и цикл завершается.
Шаги работы:
forвызываетiter(it), что приводит к__iter__().- Затем многократно вызывает
next(...), то есть__next__(). - Каждый вызов возвращает следующий элемент.
- Когда данные заканчиваются,
StopIterationостанавливает цикл.
Ключевые моменты:
- Итератор обязан иметь
__iter__()и__next__(). __iter__()обычно возвращает сам итератор:return self.__next__()должен возвращать следующий элемент и в конце подниматьStopIteration.for-цикл в Python работает через протокол итерации.- Итерируемый объект можно превратить в итератор через
iter(), но сам по себе он не всегда итератор.