iter.md
1> **Источник:** https://python-all.ru/2.7/c-api/iter.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Протокол итератора89Новое в версии 2.2.1011Есть две функции, предназначенные для работы с итераторами.1213#### `int PyIter_Check(PyObject *o)`1415Возвращает истину, если объект *o* поддерживает протокол итератора.1617Эта функция может давать ложноположительный результат для классов старого стиля, поскольку такие классы всегда определяют слот `tp_iternext`, логика которого либо вызывает метод [`next()`](https://python-all.ru/2.7/library/functions.html#next), либо порождает [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).1819#### `PyObject* PyIter_Next(PyObject *o)`2021*Возвращаемое значение: новая ссылка.*2223Возвращает следующее значение из итерации *o*. Объект должен быть итератором (проверка возлагается на вызывающую сторону). Если значений больше нет, возвращает *NULL* без установки исключения. Если при получении элемента возникает ошибка, возвращает *NULL* и передаёт исключение дальше.2425Чтобы написать цикл, который выполняет итерацию по итератору, код на C должен выглядеть примерно так:2627```c28PyObject *iterator = PyObject_GetIter(obj);29PyObject *item;3031if (iterator == NULL) {32 /* распространить ошибку */33}3435while ((item = PyIter_Next(iterator))) {36 /* сделать что-то с элементом */37 ...38 /* освободить ссылку по завершении */39 Py_DECREF(item);40}4142Py_DECREF(iterator);4344if (PyErr_Occurred()) {45 /* распространить ошибку */46}47else {48 /* продолжить выполнение полезной работы */49}50```51