# Protocolo iterador

Hay dos funciones específicas para trabajar con iteradores.

int `PyIter_Check`(PyObject *o)

  Retorna verdadero si el objeto o admite el protocolo iterador. Esta función siempre finaliza con éxito.

PyObject* `PyIter_Next`(PyObject *o)
  Return value: New reference.

  Retorna el siguiente valor de la iteración o. El objeto debe ser un iterador (depende de quién llama comprobar esto). Si no quedan valores restantes, retorna `NULL` sin establecer ninguna excepción. Si se produce un error al recuperar el elemento, retorna `NULL` y pasa la excepción.

Para escribir un bucle que itera sobre un iterador, el código en C debería verse así:

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

    if (iterator == NULL) {
        /* propagate error */
    }

    while ((item = PyIter_Next(iterator))) {
        /* do something with item */
        ...
        /* release reference when done */
        Py_DECREF(item);
    }

    Py_DECREF(iterator);

    if (PyErr_Occurred()) {
        /* propagate error */
    }
    else {
        /* continue doing useful work */
    }