Обновлено: июль 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 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
- Где и как применять? Потестируем модель после установки на разных задачах
- Как дообучить модель под себя?
iter() против __iter__() и __next__(): в чём разница
Три сущности часто путают, хотя роли у них разные:
- iter() — встроенная функция. Вы вызываете её, и она внутри дёргает
__iter__()у объекта. - __iter__() — метод объекта. Возвращает итератор. У итерируемой коллекции — новый итератор, у самого итератора —
self. - __next__() — метод итератора. Возвращает следующий элемент или бросает
StopIteration.
По документации Python, «итераторы обязаны иметь метод __iter__(), который возвращает сам объект-итератор, поэтому каждый итератор также является итерируемым». Проверить это можно так:
it = iter([1, 2, 3])
print(iter(it) is it) # True — итератор возвращает сам себя
Как StopIteration завершает итерацию в iter()

Итератор конечен. Когда данные кончаются, __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. Такой же итеративный подход лежит в основе многих алгоритмов — например, проверки числа на простоту или простой факторизации чисел.
- Выполним базовые задачи на российских нейросетях и посмотрим на результаты!
- Файл-инструкцию «Как сделать нейро-фотосессию из своего фото бесплатно, без иностранных карт и прочих сложностей»
- Покажем 10+ способов улучшить свою жизнь с ИИ каждому — от ребенка и пенсионера до управленца и предпринимателя
- Возможность получить Доступ в Нейроклуб на целый месяц
- Как ИИ ускоряет работу и приносит деньги
- За 2 часа вы получите четкий план, как начать работать с ИИ прямо сейчас!
Двухаргументная форма 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 и узнай, как пользоваться функционалом остальных ИИ в одном
- УЧАСТВОВАТЬ ЗА 0 РУБ.
- Расскажем, как получить подписку
- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросеть DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ