當前位置:編程學習大全網 - 源碼下載 - python叠代器和生成器的區別

python叠代器和生成器的區別

num 01-& gt;叠代程序

定義:

對於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)

  • 上一篇:比爾蓋茨傳記佳句
  • 下一篇:網頁視頻經過m3u8 技術切片且加密的TS文件在播放時有緩存文件,但提取出來就無法播放了,這種情況
  • copyright 2024編程學習大全網