1. 程式人生 > >Python中的iterable和iterator

Python中的iterable和iterator

下標 with self. 條件 叠代 情況下 item 遍歷 def

參照官方文檔:

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