疊代器協定
**********

有兩個專門用於疊代器的函式。

int PyIter_Check(PyObject *o)
    * 為 穩定 ABI 的一部分 自 3.8 版本開始.*

   如果物件 *o* 可以安全地傳遞給 "PyIter_Next()" 則回傳非零 (non-zero)
   ，否則回傳 0。這個函式一定會執行成功。

int PyAIter_Check(PyObject *o)
    * 為 穩定 ABI 的一部分 自 3.10 版本開始.*

   如果物件 *o* 有提供 "AsyncIterator" 協定，則回傳非零，否則回傳 0。
   這個函式一定會執行成功。

   在 3.10 版被加入.

PyObject *PyIter_Next(PyObject *o)
    *回傳值：新的參照。** 為 穩定 ABI 的一部分.*

   回傳疊代器 *o* 的下一個值。根據 "PyIter_Check()"，該物件必須是一個
   疊代器（由呼叫者檢查）。如果沒有剩餘值，則回傳 "NULL" 且不設定例外
   。如果檢索項目時發生錯誤，則回傳 "NULL" 並傳遞例外。

要編寫一個疊代於疊代器的迴圈，C 程式碼應該會像這樣：

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

   if (iterator == NULL) {
       /* 傳播錯誤 */
   }

   while ((item = PyIter_Next(iterator))) {
       /* 對 item 做些事情 */
       ...
       /* 完成後釋放參照 */
       Py_DECREF(item);
   }

   Py_DECREF(iterator);

   if (PyErr_Occurred()) {
       /* 傳播錯誤 */
   }
   else {
       /* 繼續做一些有用的任務 */
   }

type PySendResult

   用於表示 "PyIter_Send()" 不同結果的列舉 (enum) 值。

   在 3.10 版被加入.

PySendResult PyIter_Send(PyObject *iter, PyObject *arg, PyObject **presult)
    * 為 穩定 ABI 的一部分 自 3.10 版本開始.*

   將 *arg* 值發送到疊代器 *iter* 中。回傳：

   * 如果疊代器有回傳則為 "PYGEN_RETURN"。回傳值透過 *presult* 回傳。

   * 如果疊代器有產生 (yield) 則為 "PYGEN_NEXT"。產生值透過 *presult*
     回傳。

   * 如果疊代器引發例外則為 "PYGEN_ERROR"。 *presult* 被設定為 "NULL"
     。

   在 3.10 版被加入.
