Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Задачи

Войти

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

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

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: iter, next, iterable

В чем разница между __iter__ и __next__?

Вопрос проверяет, понимаете ли вы разделение ролей между “источником перебора” и “механизмом выдачи следующего элемента”.

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

__iter__() возвращает итератор — объект, из которого можно получать элементы по одному.
__next__() возвращает следующий элемент из итератора.
Когда элементы закончились, __next__() должен выбросить StopIteration.
В for обычно сначала вызывается __iter__(), а затем много раз __next__().

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

Здесь важно понимать роли методов и то, кто кому что должен вернуть.

Определения

__iter__() — “дай итератор для обхода”.
__next__() — “дай следующий элемент итератора”.

Как различаются обязанности

  1. __iter__()

    • вызывается один раз на старт обхода

    • возвращает итератор

    • часто выглядит как return iter(self.data) или return self (если объект сам итератор)

  2. __next__()

    • вызывается много раз

    • возвращает следующий элемент

    • в конце делает raise StopIteration

Типовые сценарии

Сценарий A: объект-коллекция возвращает отдельный итератор

class Bag:
    def __init__(self, items):
        self._items = list(items)

    def __iter__(self):
        return iter(self._items)  # отдаём итератор списка

Тут Bag — итерабельный, но не итератор.

Сценарий B: объект сам является итератором

class Counter:
    def __init__(self):
        self.n = 0

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

    def __next__(self):
        self.n += 1
        return self.n

Так можно, но будьте аккуратны: состояние обхода хранится прямо в объекте.

Частая ловушка

  • Если __iter__() возвращает self, то повторный for по тому же объекту продолжит с текущего состояния, а не “сначала”.

  • Для “многоразовых” коллекций обычно возвращают новый независимый итератор.

Вывод

__iter__() отвечает за получение итератора, а __next__() — за выдачу элементов и завершение перебора.

  • Аватар

    Python Guru

    Sergey Filichkin

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

Уровень

  • Рейтинг:

    5

  • Сложность:

    5

Навыки

  • Python

    Python

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

#iter

#next

#iterable

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

  • Аватар

    Python Guru

    Sergey Filichkin

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