| .. highlightlang:: c | 
 |  | 
 | .. _iterator: | 
 |  | 
 | Iterator Protocol | 
 | ================= | 
 |  | 
 | There are only a couple of functions specifically for working with iterators. | 
 |  | 
 | .. c:function:: int PyIter_Check(PyObject *o) | 
 |  | 
 |    Return true if the object *o* supports the iterator protocol. | 
 |  | 
 |  | 
 | .. c:function:: PyObject* PyIter_Next(PyObject *o) | 
 |  | 
 |    Return the next value from the iteration *o*.  If the object is an iterator, | 
 |    this retrieves the next value from the iteration, and returns *NULL* with no | 
 |    exception set if there are no remaining items.  If the object is not an | 
 |    iterator, :exc:`TypeError` is raised, or if there is an error in retrieving the | 
 |    item, returns *NULL* and passes along the exception. | 
 |  | 
 | To write a loop which iterates over an iterator, the C code should look | 
 | something like this:: | 
 |  | 
 |    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 */ | 
 |    } |