iter.md
1> **Источник:** https://python-all.ru/3.4/c-api/iter.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Протокол итератора89Есть две функции, предназначенные для работы с итераторами.1011#### `int PyIter_Check(PyObject *o)`1213Возвращает истину, если объект *o* поддерживает протокол итератора.1415#### `PyObject* PyIter_Next(PyObject *o)`1617*Возвращаемое значение: новая ссылка.*1819Возвращает следующее значение из итерации *o*. Объект должен быть итератором (проверка возлагается на вызывающую сторону). Если значений больше нет, возвращает *NULL* без установки исключения. Если при получении элемента возникает ошибка, возвращает *NULL* и передаёт исключение дальше.2021Чтобы написать цикл, который выполняет итерацию по итератору, код на C должен выглядеть примерно так:2223```c24PyObject *iterator = PyObject_GetIter(obj);25PyObject *item;2627if (iterator == NULL) {28 /* распространить ошибку */29}3031while (item = PyIter_Next(iterator)) {32 /* сделать что-то с элементом */33 ...34 /* освободить ссылку по завершении */35 Py_DECREF(item);36}3738Py_DECREF(iterator);3940if (PyErr_Occurred()) {41 /* распространить ошибку */42}43else {44 /* продолжить выполнение полезной работы */45}46```47