电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

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

一、遞歸與迭代

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

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

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

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

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

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

解釋:

有時(shí)會想,for循環(huán)的本質(zhì)就是遵循迭代器協(xié)議訪問對象,那么for循環(huán)的對象肯定都是迭代器了啊,沒錯(cuò),那既然這樣,for循環(huán)可以遍歷(字符串,,列表,字典,集合,文件對象),那這些類型的數(shù)據(jù)肯定都是可迭代對象啊?但是,為什么定義一個(gè)列表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]) #超出訪問會報(bào)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__()) #超出邊界會報(bào)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ù)類型自動(dòng)實(shí)現(xiàn)了迭代器協(xié)議(其他的數(shù)據(jù)類型需要調(diào)用自己內(nèi)置的__iter__方法),所以生成器就是可迭代對象

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

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

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

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

python使用生成器對延遲操作提供了支持,所謂延遲操作,是指在需要的時(shí)候才產(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個(gè)人,吃了%s’ %(index,baozi))## res=producer()# consumer(res)#yield 3相當(dāng)于return 控制的是函數(shù)的返回值#x=yield的另外一個(gè)特性,接受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那個(gè)位置,我就是給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、實(shí)現(xiàn)了延遲計(jì)算、省內(nèi)存

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

五、生成器表達(dá)式和列表解析

#1、三元表達(dá)式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)器表達(dá)式print(egg_two)print(egg_two.__next__())print(next(egg_two)) #next()本質(zhì)就是調(diào)用__next__

總結(jié):

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

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

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

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

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

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

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

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 恒温振荡混匀器-微孔板振荡器厂家-多管涡旋混匀器厂家-合肥艾本森(www.17world.net) | 聚氨酯保温钢管_聚氨酯直埋保温管道_聚氨酯发泡保温管厂家-沧州万荣防腐保温管道有限公司 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | cnc精密加工_数控机械加工_非标平键定制生产厂家_扬州沃佳机械有限公司 | 右手官网|右手工业设计|外观设计公司|工业设计公司|产品创新设计|医疗产品结构设计|EMC产品结构设计 | 杜甫仪器官网|实验室平行反应器|升降水浴锅|台式低温循环泵 | 长沙网站建设制作「网站优化推广」-网页设计公司-速马科技官网 | 塑钢课桌椅、学生课桌椅、课桌椅厂家-学仕教育设备首页 | 等离子表面处理机-等离子表面活化机-真空等离子清洗机-深圳市东信高科自动化设备有限公司 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 24位ADC|8位MCU-芯易德科技有限公司 | 水厂污泥地磅|污泥处理地磅厂家|地磅无人值守称重系统升级改造|地磅自动称重系统维修-河南成辉电子科技有限公司 | 电线电缆厂家|沈阳电缆厂|电线厂|沈阳英联塑力线缆有限公司 | 武汉不干胶印刷_标签设计印刷_不干胶标签印刷厂 - 武汉不干胶标签印刷厂家 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 高防护蠕动泵-多通道灌装系统-高防护蠕动泵-www.bjhuiyufluid.com慧宇伟业(北京)流体设备有限公司 | 干洗店加盟_洗衣店加盟_干洗店设备-伊蔻干洗「武汉总部」 | 杭州画室_十大画室_白墙画室_杭州美术培训_国美附中培训_附中考前培训_升学率高的画室_美术中考集训美术高考集训基地 | 灌木树苗-绿化苗木-常绿乔木-价格/批发/基地 - 四川成都途美园林 | 【法利莱住人集装箱厂家】—活动集装箱房,集装箱租赁_大品牌,更放心 | 安徽千住锡膏_安徽阿尔法锡膏锡条_安徽唯特偶锡膏_卡夫特胶水-芜湖荣亮电子科技有限公司 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 免费网站网址收录网_海企优网站推荐平台 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 济宁工业提升门|济宁电动防火门|济宁快速堆积门-济宁市统一电动门有限公司 | 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 | 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 合景一建-无尘车间设计施工_食品医药洁净车间工程装修总承包公司 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 膏方加工_丸剂贴牌_膏滋代加工_湖北康瑞生物科技有限公司 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 结晶点测定仪-润滑脂滴点测定仪-大连煜烁 | 优秀的临床医学知识库,临床知识库,医疗知识库,满足电子病历四级要求,免费试用 | 镀锌方管,无缝方管,伸缩套管,方矩管_山东重鑫致胜金属制品有限公司 |