Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: iterator, protocol

Что такое протокол итератора в Python?

Протокол итератора проверяет понимание того, как Python делает for, next() и ленивые обходы коллекций.

Короткий ответ

Протокол итератора — это набор правил, по которым объект можно последовательно “перебирать”.
Объект-итерабельный должен уметь отдавать итератор через __iter__().
Итератор должен уметь возвращать следующий элемент через __next__() и бросать StopIteration, когда элементы закончились.
Цикл for автоматически использует эти методы: получает итератор и вызывает next() до завершения.

Длинный ответ

Опишу это как контракт между вашим объектом и Python-циклом.

Определение

Протокол итератора — это соглашение:

  1. итерабельный объект реализует __iter__() и возвращает итератор;

  2. итератор реализует __next__() и сигнализирует завершение исключением StopIteration.

Итерабельный vs итератор

  1. Итерабельный (iterable)

    • умеет отвечать на iter(obj)

    • обычно хранит данные (список, строка, файл, генераторная “обёртка” и т.д.)

  2. Итератор (iterator)

    • умеет отвечать на next(it)

    • хранит состояние обхода (позицию, курсор и т.п.)

Как это работает в for

Обычно происходит примерно так:

  1. Python вызывает iter(obj) → это использует obj.__iter__()

  2. Затем многократно вызывает next(it) → это использует it.__next__()

  3. При StopIteration цикл завершается

Мини-пример своего итератора

class CountDown:
    def __init__(self, start: int):
        self.current = start

    def __iter__(self):
        return self  # сам себе итератор

    def __next__(self):
        if self.current <= 0:
            raise StopIteration
        value = self.current
        self.current -= 1
        return value

for x in CountDown(3):
    print(x)  # 3 2 1

Практическое применение

  • Ленивые вычисления (не грузить всё в память сразу)

  • Потоковая обработка данных (файлы, сокеты, курсоры БД)

  • Кастомные обходы (деревья, графы, пагинация)

Вывод

Если вы хотите, чтобы объект “естественно” работал с for, list(), sum(), any() и т.д., реализуйте протокол итератора корректно: __iter__() + __next__() + StopIteration.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Python

    Python

Ключевые слова

#iterator

#protocol

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.