迭代器是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...