日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

10 迭代器与生成器

發布時間:2025/3/16 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 10 迭代器与生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
10 迭代器與生成器

迭代與遞歸
迭代器協議:對象必須提供一個next方法 執行該方法要么返回迭代中下一項
要么引起一個stoplteration異常 以終止迭代
可迭代對象: 實現了迭代器協議的對象
協議是一種約定:可迭代對象實現了迭代器協議 Python的內部工具
(如for循環 sum max min函數等等)使用迭代器協議訪問對象

for循環式中 調用了不可迭代對象內部的_iter_方法,把它們變成了可迭代

考慮序列型和非序列型 不可用列表下標 只可迭代器協議

啥是生成器:可以理解為一種數據類型 它自動實現了迭代器協議
故生成器就是可迭代對象
生成器在Python中表現:
1.生成器函數 常規函數定義 但是 使用yield語句而不是return返回結果
yield語句一次返回一個結果

def test():yield 1yield 2yield 3 g=test() print(g) print(g._nest_) print(g._nest_)

?


2.生成器表達式 類似于列表推導 但是生成器返回按需產生結果的一個對象
而不是構建一個結果列表
生成器的優點:
對延遲操作提供了支持 不是立即產生結果 可在需要時產生

小結:
1,是可迭代對象
2、實現了延遲計算節省內存!

三元表達式

name='alex' res='SB' if name=='alex' else ' 帥 哥' print(res)

?


列表解析

egg_list=[]for i in range(10)egg_list.append('雞蛋%s' %i) print(egg_list) #or [雞蛋%s '%i for i in range(10)'] #二元 #or [雞蛋%s '%i for i in range(10)' if i >5] #三元,沒有四元

?



1.把列表解析的【】換成()得到的就是生成器表達式
2、列表解析與生成器都是一直能夠便利的編程方式,只不過生成器
表達式更省內存
3、Python不但使用迭代器協議 讓for循環更加通用,大部分函數
也是使用迭代器協議訪問對象的

sum([i for i in range (10)]) #列表解析 sum=(i for i in range (10)) #生成器表達式 幾乎不占用內存def test(): #生成器函數yield 1yield 2yield 3yield 4 res=test() print(res) print(res._next_()) print(res._next_()) print(res._next_())生成器的好處: 吃包子例子: def product_baozi():ret[]for i in range(100)ret.append('包子%s'%i)return ret boazi_list=product_baozi() print(product)#or def product_baozi():for i in range(100)yield 'baozi%s'%i pro_g=produce_baozi()baozi1=pro_g._next_() print('來一個人吃包子',baozi1) baozi2=pro_g._next_() print('來一個人吃包子',baozi2) baozi3=pro_g._next_() print('來一個人吃包子',baozi3)#做一個返回值就輸出 執行效率更好def product_egg():ret[]for i in range(100)ret.append('雞蛋%s'%i)return ret

?


#缺點1.占空間大 2.效率低

def product_egg():for i in range(100)yield '雞蛋%s'%i a=xiadan() jidan=a._next_ print('XXX取雞蛋',jidan)

?



生成器特性:
語法上類似函數:不同于 一次返回一個值
自動實現迭代器協議:
狀態掛起:使用yield返回一個值 然后掛起函數狀態 下次從離開的地方重新開始

優點:延遲計算 一次返回一個結果
提高代碼可讀性
注意事項:生成器只能遍歷一次

生產者消費者模型:

#反例: import time def producer():ret=[]for i in range(100):time.sleep(0.1)ret.append('包子%s'%i)return retdef consumer(res):for index,baozi in enumerate(res):time.sleep(0.1print('第%s個人,吃了%s'%(index,baozi))res=producer() consumer(res)#yield相當于return控制函數返回值 #x=yield 另一個特性 接受send傳過來的值 賦值給xdef test():print('開始啦')first=yield print('第一次',first)yield 2print('第二次') t=test() res=t._next_() print(res) t._next_() res=t.send('函數停留在first位置 我是給first賦值的') print(res)#正例; def consumer(name):print('我是[%s],我準備開始吃包子了'%name)while True:baozi=yieldprint('%s 開心的吃掉了%s'%[name,baozi]) def producer():c1=consumer('aaa')c2=consumer('bbb_sb')c1.__next__()c2.__next__()for i in range(10):time.sleep(1)c1.send('韭菜餡包子%s',%i)c2.send('韭菜餡包子%s',%i) producer()

?

posted on 2019-02-21 22:23 TTNTONZES 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/louzhiyuan/p/10415732.html

總結

以上是生活随笔為你收集整理的10 迭代器与生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。