Обновлено: июль 2026.

Функция iter() в Python принимает итерируемый объект и возвращает из него итератор — объект, который по одному отдаёт элементы через метод __next__(). Она запускает протокол итерации: сама вызывает __iter__() у коллекции. Когда элементы кончаются, __next__() бросает StopIteration. У iter() есть и вторая форма — iter(callable, sentinel), о которой почти нигде не пишут.

  • iter(iterable) — берёт список, строку, словарь и возвращает итератор для одного прохода.
  • Итератор помнит позицию и отдаёт элементы через next(), пока не выбросит StopIteration.
  • __iter__() возвращает сам итератор, __next__() — следующий элемент; вместе они образуют протокол.
  • iter(callable, sentinel) вызывает функцию, пока та не вернёт стоп-значение — удобно для чтения потоков.
  • Исчерпанный итератор при повторном обходе выглядит как пустой — частый источник багов.

Что делает функция iter() в Python

По данным docs.python.org.

Функция iter() — встроенная, её не нужно импортировать. Она возвращает объект-итератор из итерируемого объекта. Итерируемый (iterable) — это любой объект, «способный возвращать свои члены по одному за раз»: списки, строки, кортежи, множества, словари, файловые объекты и ваши классы с методом __iter__() или __getitem__().

Синтаксис прост:

iterator = iter(iterable)

На практике вы редко пишете iter() руками — за вас это делает цикл for. Но понимать механику полезно, особенно когда пишете свои итерируемые классы или отлаживаете обход. Если тема ошибок обхода вам близка, посмотрите разбор ошибки SyntaxError: invalid syntax — там частые огрехи синтаксиса циклов.

numbers = [1, 2, 3, 4] it = iter(numbers) print(next(it)) # 1 print(next(it)) # 2 print(next(it)) # 3

Здесь iter() превращает список в итератор it, а next() достаёт из него по одному элементу. Если объект не поддерживает ни протокол итерируемого (__iter__()), ни протокол последовательности (__getitem__()), iter() поднимает TypeError.

Мини-вывод: iter() — это точка входа в протокол итерации, а не отдельная магия. Она лишь достаёт из объекта его итератор.

ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК нейросети DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросети DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
  • Где и как применять? Потестируем модель после установки на разных задачах
  • Как дообучить модель под себя?

iter() против __iter__() и __next__(): в чём разница

Три сущности часто путают, хотя роли у них разные:

  • iter() — встроенная функция. Вы вызываете её, и она внутри дёргает __iter__() у объекта.
  • __iter__() — метод объекта. Возвращает итератор. У итерируемой коллекции — новый итератор, у самого итератора — self.
  • __next__() — метод итератора. Возвращает следующий элемент или бросает StopIteration.

По документации Python, «итераторы обязаны иметь метод __iter__(), который возвращает сам объект-итератор, поэтому каждый итератор также является итерируемым». Проверить это можно так:

it = iter([1, 2, 3]) print(iter(it) is it) # True — итератор возвращает сам себя

Как StopIteration завершает итерацию в iter()

Протокол итерации в Python: как for проходит по коллекции
Протокол итерации в Python: как for проходит по коллекции

Итератор конечен. Когда данные кончаются, __next__() вместо элемента поднимает исключение StopIteration. Цикл for ловит его молча и просто завершается — вы этого не видите. Но при ручном вызове next() исключение вылетит наружу:

it = iter([10, 20]) print(next(it)) # 10 print(next(it)) # 20 print(next(it)) # StopIteration

Чтобы не ловить исключение, next() принимает значение по умолчанию — его вернут вместо ошибки, когда элементы кончились:

it = iter([10, 20]) print(next(it, None)) # 10 print(next(it, None)) # 20 print(next(it, None)) # None вместо StopIteration

Свой класс-итератор через iter() и __next__()

Чтобы сделать класс итерируемым, реализуйте два метода: __iter__() возвращает сам объект-итератор, а __next__() отдаёт следующий элемент и в конце бросает StopIteration.

class Count: def __init__(self, low, high): self.current = low self.high = high def __iter__(self): return self def __next__(self): if self.current > self.high: raise StopIteration value = self.current self.current += 1 return value for num in Count(1, 3): print(num) # 1, 2, 3

Класс Count считает от нижней границы к верхней. Цикл for сам вызывает iter(Count(1, 3)), получает объект, а затем дёргает __next__(), пока не поймает StopIteration. Такой же итеративный подход лежит в основе многих алгоритмов — например, проверки числа на простоту или простой факторизации чисел.

РОССИЙСКИЕ НЕЙРОСЕТИ ДЛЯ ЖИЗНИ И КАРЬЕРЫ В 2025
Присоединяйся к онлайн-вебинару.
В прямом эфире разберем и потестируем лучшие на сегодняшний день отечественные ИИ!
Вы узнаете о том:
  • Выполним базовые задачи на российских нейросетях и посмотрим на результаты!
  • Файл-инструкцию «Как сделать нейро-фотосессию из своего фото бесплатно, без иностранных карт и прочих сложностей»
  • Покажем 10+ способов улучшить свою жизнь с ИИ каждому — от ребенка и пенсионера до управленца и предпринимателя
Участвовать бесплатно
ОБЗОРНЫЙ ПРАКТИКУМ ПО НАШУМЕВШИМ НЕЙРОСЕТЯМ
Нейросети DEEPSEEK И QWEN
За 2 часа сделаем полный обзор новых мощных ИИ-моделей, которые бросают вызов нейросети ChatGPT
Вы узнаете:
  • Возможность получить Доступ в Нейроклуб на целый месяц
  • Как ИИ ускоряет работу и приносит деньги
  • За 2 часа вы получите четкий план, как начать работать с ИИ прямо сейчас!
Участвовать бесплатно

Двухаргументная форма iter(callable, sentinel)

Как работает iter(callable, sentinel)
Как работает iter(callable, sentinel)

Вторая форма iter() малоизвестна, но мощна. По документации Python: «Если задан второй аргумент, sentinel, то первый аргумент должен быть вызываемым объектом. Созданный итератор будет вызывать callable без аргументов при каждом обращении к его методу __next__(); если возвращённое значение равно sentinel, будет поднято StopIteration, иначе значение будет возвращено».

Проще говоря: iter(func, stop) вызывает func() снова и снова, пока та не вернёт стоп-значение. Классический пример — чтение ввода до стоп-слова:

for line in iter(input, 'stop'): print('Получено:', line) # читает строки, пока пользователь не введёт 'stop'

Официальный пример из документации — блочное чтение бинарного файла фиксированными кусками до конца файла:

from functools import partial with open('mydata.db', 'rb') as f: for block in iter(partial(f.read, 64), b''): process_block(block)

Здесь partial(f.read, 64) — вызываемый объект, который читает по 64 байта. Как только f.read(64) вернёт пустые байты b'' (конец файла), итерация остановится. Это чище, чем цикл while True с ручной проверкой и break.

Итератор, итерируемое и генератор: сравнение

Три понятия из одного протокола, но не взаимозаменяемы:

Свойство Итерируемое (iterable) Итератор (iterator) Генератор (generator)
Обязательный метод __iter__() или __getitem__() __next__() + __iter__() оба создаются автоматически
Хранит позицию Нет Да Да
Сколько проходов Много (каждый iter() — новый итератор) Один (исчерпывается) Один
Как получить литерал списка/строки/словаря iter(obj) функция с yield или genexpr
Примеры list, str, dict, файл результат iter(), zip, map (x*x for x in nums)

Ключевое различие из документации: контейнер (например list) при каждом вызове iter() «создаёт свежий новый итератор», а итератор вернёт сам себя. Генератор — это частный случай итератора, который Python строит за вас, когда вы пишете функцию с yield.

Типичная ошибка: повторный обход исчерпанного итератора

Самая частая ловушка. Итератор одноразовый: после полного прохода он «исчерпан», и любой следующий обход выглядит как пустой контейнер.

it = iter([1, 2, 3]) print(list(it)) # [1, 2, 3] print(list(it)) # [] — итератор уже исчерпан

По глоссарию Python: «в этот момент объект-итератор исчерпан, и любые дальнейшие вызовы его метода __next__() просто снова поднимают StopIteration». Если нужен повторный проход — храните исходную коллекцию (список), а не итератор, и вызывайте iter() заново каждый раз, либо материализуйте данные в list().

Мини-вывод: итератор — это состояние, а не данные. Хотите пройти дважды — держите источник, из которого можно достать новый итератор.

Коротко: как применять iter() в Python

  • Нужен один элемент за раз из коллекции — iter() + next().
  • Пишете свой итерируемый класс — реализуйте __iter__() (возвращает self) и __next__() (бросает StopIteration в конце).
  • Читаете поток кусками до стоп-значения — iter(callable, sentinel).
  • Нужен многоразовый обход — держите коллекцию, а не итератор.
  • Нужна ленивая генерация значений — пишите генератор с yield, а не итератор-класс вручную.

Частые вопросы про iter() в Python

Чем iter() отличается от next()?

iter() создаёт итератор из итерируемого объекта, а next() достаёт из уже готового итератора следующий элемент. Сначала iter(), потом многократный next().

Что возвращает iter() для несписочных объектов?

Для любой итерируемой коллекции — строки, кортежа, словаря, множества, файла — iter() вернёт соответствующий итератор. Для объекта без __iter__() и __getitem__() будет TypeError.

Зачем нужна форма iter(callable, sentinel)?

Чтобы вызывать функцию в цикле, пока она не вернёт заданное стоп-значение. Это заменяет конструкцию while True с break — например, при чтении файла блоками или ввода до стоп-слова.

Почему второй проход по итератору пустой?

Итератор одноразовый: после исчерпания __next__() всегда поднимает StopIteration. Для повторного обхода вызывайте iter() заново на исходной коллекции.

Генератор — это итератор?

Да. Генератор (функция с yield или генераторное выражение) — частный случай итератора: Python сам добавляет ему __iter__() и __next__().

Большой практикум
ЗАМЕНИ ВСЕ НЕЙРОСЕТИ НА ОДНУ — PERPLEXITY
ПОКАЖЕМ НА КОНКРЕТНЫХ КЕЙСАХ
  • Освой нейросеть Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
  • УЧАСТВОВАТЬ ЗА 0 РУБ.
  • Расскажем, как получить подписку
Участвовать бесплатно
ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК нейросети DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросеть DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
Участвовать бесплатно