Sobes.tech
Назад к вопросам
Middle
14

Что должно присутствовать у объекта, чтобы он был итератором в Python?

Компании, где спрашивали
СБЕРСБЕР

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

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, и цикл завершается.

Шаги работы:

  1. for вызывает iter(it), что приводит к __iter__().
  2. Затем многократно вызывает next(...), то есть __next__().
  3. Каждый вызов возвращает следующий элемент.
  4. Когда данные заканчиваются, StopIteration останавливает цикл.

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

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