一個表示數據流的對象。反覆調用迭代器的__next__()
方法(或給它傳遞內建函數(built-in function)next()
)來返回在該流中的後繼項。當沒有可用數據時,產生一個StopInteration
異常。此時,迭代器對象被耗盡,以後再調用 __next__()
方法只會再次產生StopInteration
異常。迭代器要求包含一個__iter__()
方法,用於返回迭代器對象自己,所以每個迭代器也都是可迭代的,這可被用於大多數接受可迭代(對象)的場景。一個值得注意的例外是試圖多重迭代傳遞的代碼。一個容器對象(好比說list
),每次給它傳遞iter()
函數或使用for
循環時,產生一個新的迭代器。在一個迭代器中如此嘗試,經過上一個迭代的傳遞,一樣會產生耗盡的迭代器對象,這使它看起來像是一個空容器。html
來自:Glossary — Python 3.4.2 documentation中的 iterator 部分python
Python支持一個容器之上的迭代的的概念。這由兩個大相徑庭的方法實現,它們被用於讓用戶定義的類(user-defined classes)支持迭代。序列(Sequences)
,老是支持迭代方法,下面會詳細描述。函數
在容器對象中須要定義一個方法來提供迭代支持:ui
container.__iter__()
返回一個迭代器對象。此對象要求能支持下面描述的迭代協議。若是一個容器支持不一樣類型的迭代,額外的方法可被提供,來爲這些不一樣類型請求指定的迭代器。(一個對象支持多種形式的迭代的,就像樹結構支持廣度優先和深度優先遍歷同樣。)該方法對應於Python/C API中的Python對象的類型結構的tp_iter
槽(slot)。code
迭代器對象自己要求支持如下組成迭代器協議的兩個方法:htm
iterator.__iter__()
返回迭代器對象自己。這是必需的,以讓它能夠在容器和迭代器中使用for
語句和in
語句。該方法對應於Python/C API中的Python對象的類型結構的tp_iter
槽。對象
iterator.__next__()
從容器中返回下一項。若是沒有,引起StopIteration
異常。該方法對應於Python/C API中的Python對象的類型結構的tp_iternext
槽。get
Python定義了多種迭代器對象來支持在通用的和特定的序列類型、字典和其餘特定的形式之上的迭代。這些特定類型處於迭代器協議實現以外的東西,並不重要。it
一旦一個迭代器的__next__()
方法引起StopIteration
,在子序列調用中也必須這樣作。不遵照這個屬性的實現被認爲是失效的。io
來自:4. Built-in Types — Python 3.4.2 documentation中的 Iterator Types 部分