Документация Python неофициальный перевод

Протокол итератораIterator Protocol

Есть две функции, предназначенные для работы с итераторами.

int PyIter_Check(PyObject *o)

Возвращает истину, если объект o поддерживает протокол итератора.

PyObject* PyIter_Next(PyObject *o)
Возвращаемое значение: новая ссылка.

Возвращает следующее значение из итерации o. Объект должен быть итератором (проверка этого возлагается на вызывающую сторону). Если значений не осталось, возвращает NULL без установленного исключения. Если при получении элемента произошла ошибка, возвращает NULL и передаёт исключение.

Чтобы написать цикл, который выполняет итерацию по итератору, код на C должен выглядеть примерно так:

PyObject *iterator = PyObject_GetIter(obj);
PyObject *item;

if (iterator == NULL) {
    /* распространить ошибку */
}

while ((item = PyIter_Next(iterator))) {
    /* сделать что-то с элементом */
    ...
    /* освободить ссылку по завершении */
    Py_DECREF(item);
}

Py_DECREF(iterator);

if (PyErr_Occurred()) {
    /* распространить ошибку */
}
else {
    /* продолжить выполнение полезной работы */
}