Python中的iterable和iterator
參照官方文檔:
1 iterable是一個能返回它的成員的對象。包括sequence types(list,str,tuple) and not-sequence types(dict, file objects), objects and classed defined with an __iter__() method or a __getitem__() method
當一個iterable object傳入 iter()方法(同樣是調用__iter__()方法的時候)的時候,會返回一個iterator. 這是顯式創建iterator的方法。當我們用for遍歷的時候,iterator會自動創建iterator
2 iterator應該定義一個__iter__()方法(或者一個供叠代的生成器),由於有這個方法都是iterable的,所以iterator都是iterable的
iterator的__iter__()方法返回的是iterator object itself
為什麽iterator都是iterable的?因為iterator(比如list)都是可以重復遍歷的(想象並發情況下),所以需要每次__iter__()的時候返回一個獨立的叠代器。
如果iterator不是iterable的,那麽每次調用都只返回同一個iterator,一旦這個iterator到達了StopIteration的條件,就完了
註:用for遍歷對象的時候,如果對象沒有__iter__,但是實現了__getitem__,會使用下標叠代的方式
iter也是一樣,當__iter__方法沒有的時候,返回一個用下標叠代的可叠代對象來代替,比如str
可以用一個例子來解釋這一切:
class B(object): def __init__(self): pass
def next(self): yield ‘in B next‘ class A(object): def __init__(self): self.b = B()def next(self): print ‘in A next‘ def __iter__(self): return self.b a = A() for a_next in a: # 叠代的時候,a_next指向的是 B.next for a_next_value in a_next: # 使用for遍歷生成器B.next,由於B.next是無狀態的,所以可以一直死循環yield print a_next_value
可以把B.next中的內容改寫成return ‘in B next‘,將A.__iter__改為yield ‘in A iter‘, return ‘in A iter‘,甚至在B中再定義一個生成器函數在A.__iter__中返回來查看效果
Python中的iterable和iterator