python 迭代器協議 Python的迭代器協議

2021-10-12 23:13:41 字數 1624 閱讀 1721

迭代器是python中的乙個高階概念,迭代器是乙個實現了迭代器協議的物件,那何為迭代器協議呢?

滿足下面兩個條件就行。(1)該物件實現了__iter__()方法;(2)該物件實現了next()方法,返回當前元素,並指向下乙個元素的位置,如果當前位置已無元素,則丟擲stopiteration異常。

看下面例子

這說明列表這個物件實現了迭代器協議。如果乙個物件有__iter__()方法,那麼它就是可迭代物件。可以利用迭代器協議來遍歷可迭代物件,例如下面例子:#coding=utf-8

a = range(3)

it = a.__iter__()

while 1:

try:

print it.next()

except stopiteration:

break

輸出結果:

其實吧,for語句就是獲取了容器的迭代器、呼叫迭代器的next()方法以及對stopiteration進行處理等流程進行封裝了的語法糖,類似的還有in/not in語句。

迭代器的優勢有很多:

(1)定義了統一的訪問容器的介面,我們可以隨時定義自己的迭代器,只要實現了迭代器協議就行。

(2)迭代器有惰性求值的特性,它進可以在迭代至當前元素時才計算,所以非常適合遍歷元素非常多的容器,而且更省記憶體。

看下面例子:#coding=utf-8

class fab(object):

def __init__(self, max):

self.max = max

self.n, self.a, self.b = 0, 0, 1

def __iter__(self):

return self

def next(self):

if self.n 

r = self.b

self.a, self.b = self.b, self.a + self.b

self.n = self.n + 1

return r

raise stopiteration()

for one in fab(5):

print one

輸出結果如下:

迭代器使用的記憶體會更小。看看下面的例子:print sys.getsizeof(fab(5))

print sys.getsizeof([1,2,3,4,5])

輸出結果如下:

同樣是獲取含有元素1,2,3,4,5的容器,迭代器更省記憶體。還有乙個,看下面例子:print sys.getsizeof(fab(5))

print sys.getsizeof(fab(50))

print sys.getsizeof(fab(500))

print sys.getsizeof(fab(5000))

輸出結果如下:

占用的記憶體並沒有因為元素的增多而增加,所以在編寫**時要多多使用迭代器或者迭代協議。

python中內建了乙個iter()函式,可以返回乙個迭代器物件,它接受的引數是乙個實現了__iter__()方法的容器(也就是可迭代物件)或者迭代器。對於有__iter__()方法的容器,__iter__()也返回乙個迭代器物件。

python中有itertools模組,裡面的函式都是用迭代器實現的,效率很高,有時間你可以去了解下。

python 迭代器協議

1 迭代器協議是指 物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項 要麼就引起乙個stopiteratior異常,以終止迭代 只能往後走不能往前退 2 可迭代物件 實現了迭代器協議的物件 如何實現 物件內部定義乙個 iter 方法 3 協議是一種約定,可迭代物件實現了迭代器協議,py...

Python學習筆記 迭代器和迭代器協議

術語概念解釋 關於 for 迴圈 寫乙個迭代器 1 迭代器協議 迭代器協議是一種約定,即物件必須提供乙個 next 方法,執行該方法要麼返回迭代中的下一項,要麼丟擲乙個 stopiteration 異常,終止迭代。2 迭代器 iterator 迭代器是一種物件,一種可以被 next 函式呼叫並不斷返...

迭代器協議

l list hello 這就是在做例項化,list是乙個類 for i in l 先將乙個物件執行 iter print i class foo def init self,n self.n n def iter self return self def next self if self.n 1...