亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Python迭代器協議及for循環工作機制詳解

瀏覽:53日期:2022-07-17 14:45:34

一、遞歸與迭代

二、什么是迭代器協議

1、迭代器協議是指:對象必須提供一個next方法,執行該方法要么返回迭代中的下一項,要么就引起一個stopiteration異常,已終止迭代(只能往后走不能往前退)

2、可迭代對象:實現了迭代器協議的對象(如何實現:對象內部定義一個__iter__()方法)

3、協議是一種約定,可迭代對象實現了迭代器協議,python的內部工具(如for循環,sum,min,max函數等)使用迭代器協議訪問對象。

三、python中強大的for循環機制

for循環的本質:循環所有對象,全部是使用迭代器協議

解釋:

有時會想,for循環的本質就是遵循迭代器協議訪問對象,那么for循環的對象肯定都是迭代器了啊,沒錯,那既然這樣,for循環可以遍歷(字符串,,列表,字典,集合,文件對象),那這些類型的數據肯定都是可迭代對象啊?但是,為什么定義一個列表l=[1,2,3,4]沒有next()方法。

(字符串,列表,元組,字典,集合,文件對象)這些都不是可迭代對象,只不過在for循環中,調用了他們內部的__iter__方法,把他們變成了可迭代對象

然后for循環調用可迭代對象的__next__方法去取值,而且for循環會捕捉stoplteration異常,已終止迭代

l=[1,2,3,4,5]#下標訪問方式print(l[0])print(l[7]) #超出訪問會報IndexError: list index out of range#遵循迭代器協議的方式diedai=l.__iter__()print(diedai.__next__())print(diedai.__next__())print(diedai.__next__())print(diedai.__next__())print(diedai.__next__())print(diedai.__next__()) #超出邊界會報StopIteration#for循環訪問方式:#for循環本質就是遵循迭代器協議的訪問方式,先調用diedai.__iter__()方法,或者直接diedai=iter(l),然后依次執行diedai.next(),直到for循環捕捉到StopIteration終止循環#for循環所有對象的本質都是一樣的道理for i in l: #diedai=l.__iter__() print(l[i]) #i=diedai.next()#使用while模擬for循環做的事情diedai_l=l.__iter__()while True: try: print(diedai_l.__next__()) except StopIteration: print('迭代完畢,終止循環') break

四、生成器初探

什么是生成器?

可以理解為一種數據類型,這種數據類型自動實現了迭代器協議(其他的數據類型需要調用自己內置的__iter__方法),所以生成器就是可迭代對象

生成器分類及在python中的表現形式:(python有兩種不同的方法提供生成器)

1、生成器函數:常規函數定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回一個結果,在沒個結果中間,掛起函數的狀態,以便下次用它離開的地方繼續執行

2、生成器表達式:類似于列表推導,但是,生成器返回按需產生結果的一個對象,而不是一次構建一個結果列表

為何使用生成器以及生產器的優點:

python使用生成器對延遲操作提供了支持,所謂延遲操作,是指在需要的時候才產生結果,而不是立即產生結果,這也是生產器的重要好處

import time# def producer():# ret=[]# for i in range(100):# time.sleep(0.1)# ret.append(’包子%s’ %i)# return ret## def consumer(res):# for index,baozi in enumerate(res):# time.sleep(0.1)# print(’第%s個人,吃了%s’ %(index,baozi))## res=producer()# consumer(res)#yield 3相當于return 控制的是函數的返回值#x=yield的另外一個特性,接受send傳過來的值,賦值給x# def test():# print(’開始啦’)# firt=yield #return 1 first=None# print(’第一次’,firt)# yield 2# print(’第二次’)## t=test()# res=t.__next__() #next(t)# print(res)# # t.__next__()# # res=t.send(None)# res=t.send(’函數停留在first那個位置,我就是給first賦值的’)# print(res)# def producer():# ret=[]# for i in range(100):# time.sleep(0.1)# ret.append(’包子%s’ %i)# return retdef consumer(name): print(’我是[%s],我準備開始吃包子了’ %name) while True: baozi=yield time.sleep(1) print(’%s 很開心的把【%s】吃掉了’ %(name,baozi))def producer(): c1=consumer(’wupeiqi’) c2=consumer(’yuanhao_SB’) c1.__next__() c2.__next__() for i in range(10): time.sleep(1) c1.send(’包子 %s’ %i) c2.send(’包子 %s’ %i)producer()

生產器小結

1、生成器是可迭代對象

2、實現了延遲計算、省內存

3、生成器本質和其他的數據類型一樣,都是實現了迭代器協議,只不過生成器附加了一個延遲計算省內存的好處,其余的可迭代對象可沒有這點好處

五、生成器表達式和列表解析

#1、三元表達式name='alex'name='yangyl'res='1' if name=='yangyl' else '2'print(res)egg_list=['雞蛋%s' %i for i in range(10) ] #列表解析print(egg_list)#使用生產器獲取egg_two=('雞蛋%s' %i for i in range(10)) #生產器表達式print(egg_two)print(egg_two.__next__())print(next(egg_two)) #next()本質就是調用__next__

總結:

1、把列表解析中的[]換成() 得到的就是生成器表達式

2、列表解析與生成器表達式都是一種便利的編程方式,只不過生成器表達式更節省內存

3、python不但使用迭代器協議,讓for循環變得更加通用。大部分內置函數,也是使用迭代器協議訪問對象的。列如:sum函數是python的內置函數,該函數使用迭代器協議訪問對象,而生成器實現了迭代器協議,所以我們可以直接這樣計算一系列值的和:

s1=sum(x ** 2 for x in range(4))print(s1)

而不用多此一舉先構造一個列表

s2=sum([x ** 2 for x in range(4)])print(s2)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 国产免费做爰午夜视频 | 国产中文字幕亚洲 | 午夜精品在线视频 | 亚洲最大成人综合网 | 欧美大片毛片大片 | 亚洲一区二区欧美 | 日韩高清免费在线观看 | 国产成人小视频 | 天堂亚洲欧美日韩一区二区 | 亚洲精品综合一二三区在线 | 亚洲黄色高清 | 国产人做人爱免费视频 | 幸福宝色多多 | 日本黄色大片免费 | 欧美日韩一区二区在线视频 | 韩国主播19福利视频在线观看 | 99久久精品自在自看国产 | 美国一级毛片片aa成人 | 亚洲欧美4444kkkk| 高h文bl| 亚洲国产欧美在线 | 6080yy午夜不卡一二三区久久 | 一区二区三区四 | 九九51精品国产免费看 | 五月婷婷开心中文字幕 | 久久久香蕉视频 | 黑人操日本人视频 | 高清国产美女一级a毛片录 高清国产美女在线观看 | 欧美 日韩 中文字幕 | 午夜丁香 | 一区二区在线视频免费观看 | 欧美另类69xxxxx免费 | 国产肥老妇视频69 | 青青操手机看 | 黄色国产在线视频 | 国产成人精品免费大全 | 日韩视频高清 | 中国一级特黄真人毛片免费看 | 精品国产免费人成网站 | 99re5久久在热线播放 | 国产精品真实对白精彩久久 |