# 迭代器对象

Python 提供了两个通用迭代器对象。第一个是序列迭代器，它可与支持 `__getitem__()` 方法的任意序列一起使用。第二个迭代器使用一个可调用对象和一个哨兵值，为序列中的每个项目调用可调用对象，并在返回哨兵值时结束迭代。

PyTypeObject PySeqIter_Type
  属于 稳定 ABI.

  由 `PySeqIter_New()` 和内置序列类型的内置函数 `iter()` 的单参数形式所返回的迭代器对象的类型对象。

int PySeqIter_Check(PyObject *op)

  如果 op 的类型为 `PySeqIter_Type` 则返回真值。此函数总是会成功执行。

PyObject *PySeqIter_New(PyObject *seq)
  返回值：新的引用。 属于 稳定 ABI.

  返回一个与常规序列对象 seq 一起使用的迭代器。当序列下标操作引发 `IndexError` 时，迭代结束。

PyTypeObject PyCallIter_Type
  属于 稳定 ABI.

  由函数 `PyCallIter_New()` 和 `iter()` 内置函数的双参数形式返回的迭代器对象类型对象。

int PyCallIter_Check(PyObject *op)

  如果 op 的类型为 `PyCallIter_Type` 则返回真值。此函数总是会成功执行。

PyObject *PyCallIter_New(PyObject *callable, PyObject *sentinel)
  返回值：新的引用。 属于 稳定 ABI.

  返回一个新的迭代器。第一个参数 callable 可以是任何可以在没有参数的情况下调用的 Python 可调用对象；每次调用都应该返回迭代中的下一个项目。当 callable 返回等于 sentinel 的值时，迭代将终止。

## Range 对象

PyTypeObject PyRange_Type
  属于 稳定 ABI.

  `range` 对象的类型对象。

int PyRange_Check(PyObject *o)

  如果对象 o 是 `range` 对象的实例则返回真值。此函数总是会成功执行。

## 内置迭代器类型

这些是包括在 Python 的 C API 中的内置迭代类型，但未提供附加功能。将它们放在这里是为保持内容完整。

C 类型 | Python 类型
--- | ---
PyTypeObject PyEnum_Type 属于 稳定 ABI. | `enumerate`
PyTypeObject PyFilter_Type 属于 稳定 ABI. | `filter`
PyTypeObject PyMap_Type 属于 稳定 ABI. | `map`
PyTypeObject PyReversed_Type 属于 稳定 ABI. | `reversed`
PyTypeObject PyZip_Type 属于 稳定 ABI. | `zip`

## 其他迭代器对象

PyTypeObject PyByteArrayIter_Type
  属于 稳定 ABI.

PyTypeObject PyBytesIter_Type
  属于 稳定 ABI.

PyTypeObject PyListIter_Type
  属于 稳定 ABI.

PyTypeObject PyListRevIter_Type
  属于 稳定 ABI.

PyTypeObject PySetIter_Type
  属于 稳定 ABI.

PyTypeObject PyTupleIter_Type
  属于 稳定 ABI.

PyTypeObject PyRangeIter_Type
  属于 稳定 ABI.

PyTypeObject PyLongRangeIter_Type
  属于 稳定 ABI.

PyTypeObject PyDictIterKey_Type
  属于 稳定 ABI.

PyTypeObject PyDictRevIterKey_Type
  属于 稳定 ABI 自 3.8 版起.

PyTypeObject PyDictIterValue_Type
  属于 稳定 ABI.

PyTypeObject PyDictRevIterValue_Type
  属于 稳定 ABI 自 3.8 版起.

PyTypeObject PyDictIterItem_Type
  属于 稳定 ABI.

PyTypeObject PyDictRevIterItem_Type
  属于 稳定 ABI 自 3.8 版起.

PyTypeObject PyODictIter_Type

  用于多种内置对象的迭代器的类型对象。

  请不要直接创建这些类型的实例；应改为调用 `PyObject_GetIter()`。

  请注意一个给定的内置类型并不保证会使用一个给定的迭代器类型。例如，对 `range` 的迭代将根据 range 对象的大小使用两种迭代器类型之一。其他类型可能会在未来使用类似的方案，事先不会发出警告。