iter.md
1> **Источник:** https://python-all.ru/2.6/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](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*o*)**1415Возвращает истину, если объект1617*o*1819поддерживает протокол итератора.2021**[PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject)\* `PyIter_Next`([PyObject](https://python-all.ru/2.6/c-api/structures.html#PyObject) *\*o*)**2223*Возвращаемое значение: новая ссылка.*2425Возвращает следующее значение из итерации *o*. Если объект является итератором, извлекает следующее значение из итерации и возвращает *NULL* без установленного исключения, если не осталось элементов. Если объект не является итератором, возбуждается [`TypeError`](https://python-all.ru/2.6/library/exceptions.html#exceptions.TypeError), или, если при извлечении элемента произошла ошибка, возвращает *NULL* и передаёт исключение.2627Чтобы написать цикл, который выполняет итерацию по итератору, код на C должен выглядеть примерно так:2829```c30PyObject *iterator = PyObject_GetIter(obj);31PyObject *item;3233if (iterator == NULL) {34 /* распространить ошибку */35}3637while (item = PyIter_Next(iterator)) {38 /* сделать что-то с элементом */39 ...40 /* освободить ссылку по завершении */41 Py_DECREF(item);42}4344Py_DECREF(iterator);4546if (PyErr_Occurred()) {47 /* распространить ошибку */48}49else {50 /* продолжить выполнение полезной работы */51}52```53