日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Python迭代器協(xié)議及for循環(huán)工作機制詳解

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

一、遞歸與迭代

二、什么是迭代器協(xié)議

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

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

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

三、python中強大的for循環(huán)機制

for循環(huán)的本質(zhì):循環(huán)所有對象,全部是使用迭代器協(xié)議

解釋:

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

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

然后for循環(huán)調(diào)用可迭代對象的__next__方法去取值,而且for循環(huán)會捕捉stoplteration異常,已終止迭代

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

四、生成器初探

什么是生成器?

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

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

1、生成器函數(shù):常規(guī)函數(shù)定義,但是,使用yield語句而不是return語句返回結(jié)果。yield語句一次返回一個結(jié)果,在沒個結(jié)果中間,掛起函數(shù)的狀態(tài),以便下次用它離開的地方繼續(xù)執(zhí)行

2、生成器表達式:類似于列表推導(dǎo),但是,生成器返回按需產(chǎn)生結(jié)果的一個對象,而不是一次構(gòu)建一個結(jié)果列表

為何使用生成器以及生產(chǎn)器的優(yōu)點:

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

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相當(dāng)于return 控制的是函數(shù)的返回值#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(’函數(shù)停留在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],我準(zhǔn)備開始吃包子了’ %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()

生產(chǎn)器小結(jié)

1、生成器是可迭代對象

2、實現(xiàn)了延遲計算、省內(nèi)存

3、生成器本質(zhì)和其他的數(shù)據(jù)類型一樣,都是實現(xiàn)了迭代器協(xié)議,只不過生成器附加了一個延遲計算省內(nèi)存的好處,其余的可迭代對象可沒有這點好處

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

#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)#使用生產(chǎn)器獲取egg_two=('雞蛋%s' %i for i in range(10)) #生產(chǎn)器表達式print(egg_two)print(egg_two.__next__())print(next(egg_two)) #next()本質(zhì)就是調(diào)用__next__

總結(jié):

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

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

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

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

而不用多此一舉先構(gòu)造一個列表

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本欧美在线看| 久久一区视频| 偷拍精品精品一区二区三区| 国产亚洲字幕| 老司机精品视频网| 福利在线免费视频| 久久婷婷亚洲| 亚洲大全视频| 亚洲精品影视| 麻豆精品在线观看| 日韩中文影院| 鲁大师影院一区二区三区| 亚洲麻豆一区| 免费在线亚洲| 在线日韩中文| 日韩一区免费| 成人一二三区| av不卡免费看| 日本精品国产| 精品高清久久| 91久久黄色| 国产欧美高清视频在线| 成人av三级| 一区二区三区网站| 久久精品女人| 蜜桃一区二区三区| 日韩欧美三区| 狠狠久久伊人| 影院欧美亚洲| 国产美女视频一区二区| 日韩在线短视频| 亚州精品视频| 国产中文字幕一区二区三区| 久久久影院免费| 日韩中文字幕| 亚洲成人va| 青草国产精品| 日韩一区电影| 日韩国产在线观看| 久久天堂成人| 国产精品jk白丝蜜臀av小说| 欧美日韩亚洲三区| 2023国产精品久久久精品双| 国产精品地址| 亚洲男女自偷自拍| 日韩电影免费网站| 欧美一级一区| 国产视频久久| 国产aⅴ精品一区二区三区久久| 红桃视频国产精品| 久久亚洲精品中文字幕| 欧美经典一区| 亚洲精品欧美| 亚洲一级影院| 粉嫩av一区二区三区四区五区| 国产婷婷精品| 久久男人av资源站| 国产精品一区亚洲| 亚洲欧洲国产精品一区| 自由日本语亚洲人高潮| аⅴ资源天堂资源库在线| 天堂av一区| 国产亚洲精品v| 色黄视频在线观看| 国产日韩一区二区三区在线| 亚洲黄色影院| 日韩精品欧美| 国产一区二区精品久| 91嫩草精品| 只有精品亚洲| 亚洲综合二区| 五月天激情综合网| 欧美sss在线视频| 高潮一区二区| 麻豆精品久久久| 日韩高清不卡一区二区| 三级一区在线视频先锋| 亚洲精品一二三区区别| 精精国产xxxx视频在线野外| 精品一区二区三区的国产在线观看| 日韩av一二三| 亚洲精品国模| 日韩在线卡一卡二| 国产精品日本欧美一区二区三区| 久久九九99| 精品欧美一区二区三区在线观看| 国产精品视频一区二区三区| 日韩av电影一区| 日韩欧美三区| 日韩av资源网| 国产欧美一区二区三区精品观看| 日本精品一区二区三区在线观看视频| 水野朝阳av一区二区三区| 日韩亚洲一区在线| 国产suv精品一区二区四区视频 | 国产精品亚洲欧美| 日本久久二区| 国产麻豆精品| 久久精品超碰| 国产精品99久久免费| 久久爱www成人| 国产精品久久久久久久久久白浆| 91亚洲无吗| 麻豆久久久久久久| 国产精品久久久久久久免费观看| 精品视频在线观看网站| 精品不卡一区| 视频在线不卡免费观看| 国产一区二区三区天码| 成人va天堂| 日韩一区二区免费看| 国产亚洲网站| 日本精品在线播放| 国产一区二区三区黄网站| 成人福利视频| 五月婷婷亚洲| 日韩av不卡在线观看| 国产精品大片免费观看| 成人小电影网站| 一区在线免费| 97se亚洲| 在线看片福利| 欧美日韩水蜜桃| 丝袜美腿亚洲色图| 国产精品久久久久77777丨| 国产一区2区| 婷婷亚洲五月色综合| 日韩av字幕| 日韩免费在线| 一区二区亚洲视频| 国产一区二区三区探花| 亚洲欧美日韩高清在线| 国产调教精品| 欧美日韩视频免费看| 麻豆视频在线看| 99国产精品| 欧美a一区二区| 久久国产毛片| 69堂精品视频在线播放| 欧美激情麻豆| 影院欧美亚洲| 欧美a级一区二区| 午夜欧美精品| 国产精品最新自拍| 亚洲国产综合在线看不卡| 欧美一级全黄| 精品一区在线| 美女久久精品| 久久午夜视频| 日韩久久精品| 欧美自拍一区| 欧美日韩国产免费观看视频| 色婷婷成人网| 欧美天堂视频| 欧美在线黄色| 亚洲一区二区成人| 欧美韩日一区| 四虎成人精品一区二区免费网站| 国产成人黄色| 日本h片久久| 欧美日韩精品免费观看视频完整| 国产三级精品三级在线观看国产| 欧美特黄一级| 国产精品高颜值在线观看| 日本久久一区| 国产精品丝袜xxxxxxx| 天堂中文av在线资源库| 日韩精品视频网站| 亚洲小说欧美另类婷婷| 日韩成人免费| 国产日韩高清一区二区三区在线| 亚洲一区成人| 九九久久婷婷| 日韩欧美中文| 美女精品一区二区| 日本在线一区二区三区| 日韩一区二区免费看| 精品丝袜在线| 久草免费在线视频| 狠狠久久伊人| 免费一区二区三区在线视频| 日韩和欧美一区二区| 久久精品国产www456c0m| 久久av影院| 欧美视频久久| 亚洲精品无吗| 久久亚洲图片| 欧美日韩视频一区二区三区| 日韩精品欧美| 亚洲成人二区| 久久免费高清| 日韩视频网站在线观看| 成人亚洲一区| 大香伊人久久精品一区二区 | 石原莉奈一区二区三区在线观看| а√天堂8资源在线| 精品一区二区三区四区五区| 国产精品一线| 国产精品三级| 国产免费av一区二区三区|