← Назад к вопросам

Какие методы нужно переопределить для реализации итератора?

2.2 Middle🔥 171 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Методы для реализации итератора

Для создания итератора в Python нужно реализовать два магических метода: __iter__() и __next__().

Основные методы

1. __iter__() — инициализация итератора

Овозвращает сам итератор или новый объект итератора.

2. __next__() — получение следующего элемента

Возвращает следующий элемент, или выбрасывает StopIteration когда элементы закончились.

Полный пример итератора

class CountUp:
    def __init__(self, max):
        self.max = max
        self.current = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.current < self.max:
            self.current += 1
            return self.current
        else:
            raise StopIteration

for num in CountUp(3):
    print(num)  # 1, 2, 3

Разница между итератором и итерируемым

  • Итерируемый: объект с методом __iter__() (список, строка, словарь)
  • Итератор: объект с методами __iter__() и __next__()
class CustomRange:
    def __init__(self, max):
        self.max = max
    
    def __iter__(self):
        return RangeIterator(self.max)

class RangeIterator:
    def __init__(self, max):
        self.max = max
        self.index = 0
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.index < self.max:
            self.index += 1
            return self.index
        raise StopIteration

for num in CustomRange(3):
    print(num)

Генератор - простой способ

Генератор использует yield и автоматически реализует интерфейс итератора:

def count_up(max):
    current = 0
    while current < max:
        current += 1
        yield current

for num in count_up(3):
    print(num)

Практический пример: итератор по файлу

class FileIterator:
    def __init__(self, filename):
        self.file = open(filename, "r")
    
    def __iter__(self):
        return self
    
    def __next__(self):
        line = self.file.readline()
        if not line:
            self.file.close()
            raise StopIteration
        return line.strip()

for line in FileIterator("data.txt"):
    print(line)

Важные моменты

  1. __iter__() должен возвращать объект с методом __next__()
  2. __next__() должен выбросить StopIteration когда элементы закончились
  3. Генератор с yield - это удобный способ создания итераторов
  4. Итератор может быть использован только один раз (статефул)
  5. Каждый вызов for использует итератор полностью

Проверка итератора

from collections.abc import Iterator, Iterable

my_iter = CountUp(3)
print(isinstance(my_iter, Iterator))
print(isinstance(my_iter, Iterable))

Итератор - это фундаментальная концепция Python, которая используется везде: в цикле for, при работе с файлами, в функциях map/filter, в понимании списков (list comprehension).