定義:
對於list、string、tuple、dict等容器對象來說,用於循環遍歷非常方便。在後臺對容器對象調用iter()函數進行語句。Iter()是python內置函數。
iter()函數返回壹個叠代器對象,該對象定義了next()方法,該方法逐個訪問容器中的元素。Next()也是python內置函數。當沒有後續元素時,next()將拋出StopIteration異常,通知for語句循環結束。
叠代器用來幫助我們記錄每次叠代訪問的位置。當我們在叠代器上使用next()函數時,叠代器將返回它記錄的下壹個位置的數據。實際上,在使用next()函數時,調用的是叠代器對象的_next_ method(python 3中對象的_ next _ method,Python2中對象的next()方法)。所以如果要構造壹個叠代器,就必須實現它的_next_ method。但這還不夠。python要求叠代器本身是叠代的,所以我們要為叠代器實現_iter_ method,而_iter_ method返回壹個叠代器,叠代器本身就是叠代器,所以叠代器的_iter_ method可以返回自身。
壹些術語的解釋:
1,叠代器協議:對象需要提供next()方法,要麽返回叠代中的下壹項,要麽引發StopIteration異常終止叠代。
2.叠代對象:實現了叠代器協議對象。List、tuple、dict都是可叠代對象,但不是叠代器。但是,您可以使用內置函數iter()將這些轉換成Iterable(叠代器對象)。
3.Iterable循環中for item的本質是通過iter()函數獲取叠代對象的叠代器,然後調用next()方法獲取下壹個值並賦給item,遇到StopIteration異常時循環結束。
Python自己的容器對象案例:
#只需定義壹個listlistlistarray = #使用iter()函數iterName=iter(listArray)。
Print(iterName)#結果如下:是list #的叠代器
打印(下壹個(iterName))
打印(下壹個(iterName))
Print(next(iterName))#不叠代到下壹個元素,直接拋出異常# 1 # 2 # 3 # traceback(最近壹次調用last): # file "test07.py ",第32行,in
Python中實現_iter_ method和_next_ method的類對象是叠代器。下面這個案例是壹個計算斐波那契數列的案例。
類別纖維(對象):
def __init__(self,max):
超級(Fib,self)。__init__()
self.max = max def __iter__(self):
self.a = 0
self.b = 1
返回自我定義__下壹個_ _(自我):
fib = self.a if fib >self.max:提升StopIteration
Self.a,self.b = self.b,self.a+self.b return fib #定義壹個main函數,叠代每個斐波那契數def main():
# 20以內的數字
fib = Fib中I的Fib(20 ):
print(I)# test if _ _ name _ = = ' _ _ main _ _ ':
main()1234567891011213141516171819202122232425262728
解釋:
在這個類的實現中,定義了壹個_iter_(self)方法,當for循環遍歷並返回壹個叠代器時,iter()調用這個方法。因為遍歷時直接調用python內置函數iter(),iter()通過調用_iter_(self)獲得對象的叠代器。使用叠代器,可以逐個遍歷元素。在逐個遍歷時,我們還使用內置的next()函數,通過調用對象的_next_(self)方法來遍歷叠代器對象。所以要實現兩個方法_iter_(self)和_next_(self)。
而且因為實現了_next_(self)方法,所以在實現_iter_(self)的時候,直接返回self就可以了。
總而言之,就是:
在遍歷自定義容器對象時,會使用python內置函數iter()調用叠代器的_iter_(self)得到叠代器,然後使用next()調用叠代器對象的_next_(self)。
註意:_iter_(self)只會被調用壹次,_next_(self)會被調用n次,直到發生StopIteration異常。
num 02-& gt;建設者
功能:
& gt延遲操作。也就是說,只有在需要的時候才產生結果,而不是立即產生。12
註意事項:
& gt生成器只能遍歷壹次。
& gt生成器是壹種特殊的叠代器。123
分類:
第壹類:生成器函數:函數還是用def定義的,但結果是用yield而不是return語句返回的。yield語句壹次返回壹個結果,在每個結果的中間,函數的狀態被掛起,以便下次從它停止的地方繼續執行。
下面是壹個例子:
#斐波那契序列定義纖維(最大):
n,a,b = 0,0,1
而n & lt最大:產量b
a,b = b,a + b
n = n + 1
返回“親愛的!‘沒有數據……’#調用方法生成10數到f=Fib(10)#使用循環捕獲上次返回的值並保存在異常StopIteration的值中,同時為True: try:
x =下壹個(f)
print("f:",x)除了StopIteration作為e:
打印("生成器最終返回值為:",e . value)break 12345678910112131415151665438。
第二類:生成器表達式:類似於列表。
,只是放了壹對大括號# generator,類似於list,但是把[]改為()gen=(a為小可中的a)為i in gen:
Print(i)#結果是:2345#為什麽要用生成器?因為效率。#使用生成器表達式代替列表派生,可以同時節省cpu和內存(RAM)。#如果構造壹個列表只是為了將它傳遞給其他函數,#例如,傳遞給tuple()或set(),請改用生成器表達式!#在這種情況下,列表直接轉換成元組kk=tuple(小可中a對a)。
Print(kk)#結果是:(2,3,4,5)# Python內置的壹些函數可以識別出這是壹個生成器表達式,外面有壹對括號,就是生成器結果1 = sum (a對於range (3)中的a)。
Print(result1)#列表推導公式result2=sum([a for a in range(3)])
打印(結果2)