Iterator vs Iterable vs Generator

一個迭代是一個物件,可以返回一個迭代器。具有 __iter__ 方法並返回迭代器的狀態的任何物件都是可迭代的。它也可以是沒有實現 __getitem__ 方法的狀態的物件。 - 該方法可以採用索引(從零開始)並在索引不再有效時引發 IndexError

Python 的 str 類是 __getitem__ 可迭代的一個例子。

一個迭代器是產生在一個序列中,當你呼叫 next(*object*) 一些物體上的下一個值的物件。而且,任何使用 __next__ 方法的物件都是迭代器。迭代器在耗盡迭代器後會升高 StopIteration,此時無法重複使用。

可變類:

可迭代類定義了 __iter____next__ 方法。可迭代類的示例:

class MyIterable:

    def __iter__(self):

         return self

    def __next__(self):
         #code

#Classic iterable object in older versions of python, __getitem__ is still supported...
class MySequence:

    def __getitem__(self, index):

         if (condition):
             raise IndexError
         return (item)

 #Can produce a plain `iterator` instance by using iter(MySequence())

嘗試從 collections 模組例項化抽象類以更好地看到這一點。

例:

Python 2.x >= 2.3

import collections
>>> collections.Iterator()
>>> TypeError: Cant instantiate abstract class Iterator with abstract methods next

Python 3.x >= 3.0

>>> TypeError: Cant instantiate abstract class Iterator with abstract methods __next__

通過執行以下操作處理 Python 2 中可迭代類的 Python 3 相容性:

Python 2.x >= 2.3

class MyIterable(object): #or collections.Iterator, which I'd recommend....

     ....

     def __iter__(self): 

          return self

     def next(self): #code

     __next__ = next

這兩個現在都是迭代器,可以通過以下方式迴圈:

ex1 = MyIterableClass()
ex2 = MySequence()

for (item) in (ex1): #code
for (item) in (ex2): #code

生成器是建立迭代的簡單方法。生成器迭代器,迭代器是可迭代的。