欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

python3.6生成器yield用法實例分析

系統 1610 0

本文實例講述了python3.6生成器yield用法。分享給大家供大家參考,具體如下:

今天看源碼的時候看到了一個比較有意思的函數:yield

功能與return類似,都是返回定義的函數的一個結果,不同的是return返回后這次調用函數就結束了,除了返回值,其余臨時變量都會被清除。而yield會停止在當前步,并保留其余變量的值,等下次調用該函數時,從yield的下一步繼續往下運行。

yield的好處是如果函數需要很大的內存,比方說需要計算并返回一個很大的數列,如果用return,我們只能用一個list來存儲每一步再輸出,而用yield的話,只需要一個變量的內存即可,每次輸出當前步的值,下次調用函數接著從這一步繼續。

文字不太好說明,看一個很容易理解的例子:(python3.6)

我們定義一個函數test(),看看return的效果

            
def test(n):
  for i in range(n):
    return i
    print('mark')


          

測試結果

            
for i in range(5):
  print(test(3))


          

輸出

0
0
0
0
0

每次調用函數時碰到return就自動結束了,返回當前i值

再來看看yield的效果:

            
def test2(n):
  for i in range(n):
    yield i
    print('mark')

          

測試

            
for i in range(5):
  print(test2(3))


          

輸出



只要函數中含有yield,python就會默認這個函數是一個生成器,這個測試相當于重復打開了三次生成器

生成器需要用 next() 調用

測試

            
t = test2(3)
for i in range(3):
  print('i=',i)
  print(next(t))

          

next(t) 等同于 t.__next__()

結果

i= 0
0
i= 1
mark
1
i= 2
mark
2

可以看到,第一次返回 i=0 之后,第二次再調用函數時,從 yield i 的下一步繼續,即 print('mark')

生成器還支持用 send() 將值傳遞進函數:

            
def test3():
  value = (yield 1)
  print(value)
  print('mark1')
  value = (yield value)
  print(value)
  print('mark2')


          

測試

            
t2 = test3()
print(t2.__next__())
print('-----------')
print(t2.send(2))
print('-----------')
print(t2.send(3))


          

輸出

1
-----------
2
mark1
2
-----------
3
mark2
---------------------------------------------------------------------------
StopIteration???????????????????????????? Traceback (most recent call last)
in ()
????? 4 print(t2.send(2))
????? 5 print('-----------')
----> 6 print(t2.send(3))

StopIteration:

第一次next()返回1,并在當前停止,send(2)會將2傳輸給當前停止的那一步yield處,即相當于 value = (yield 1) 變為 value = (2)

然后繼續運行

            
print(value)
print('mark1')
value = (yield value)


          

碰到yield再次停止,返回此時的vlue值2,之后 send(3) 將3傳輸給當前停止那一步yield處,即第二個 yield value 處,繼續運行

            
print(value)
print('mark2')


          

生成器運行結束后生成StopIteration

更多關于Python相關內容可查看本站專題:《Python數據結構與算法教程》、《Python Socket編程技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程》

希望本文所述對大家Python程序設計有所幫助。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美精品一区二区三区在线 | 免费在线一区二区 | 欧美视频在线一区 | 欧美无乱码久久久免费午夜一区 | 欧美日韩一区二区三区在线观看 | av资源在线天堂 | 91短视频在线观看 | 欧美成人h版在线观看 | 久草在线影 | 欧美黄色一级 | 成人网页 | 欧美亚洲一区二区三区四区 | 亚洲精品一区中文字幕乱码 | 26uuu最新地址 | 蜜桃在线视频 | jizzjizz丝袜老师 | 久久高清 | aaa毛片在线 | 麻豆短视频app网站 天天澡天天碰天天狠伊人五月 | 亚洲成人在线免费 | 亚洲热视频| 日韩精品一区二区在线观看 | 成人免费毛片高清视频 | 亚洲激情视频在线观看 | 国产美女亚洲精品久久久综合 | 碰碰碰人人澡人人爱摸 | 日产国产欧美视频一区精品 | 日韩精品小视频 | 色草在线| 超碰3| 四虎影片 | 久久精品91久久久久久再现 | 国产日本亚洲 | 欧美精品成人a多人在线观看 | 电视剧知青1至45集免费观看 | 成人伊人 | 奇米777视频国产 | 色综合天天天天做夜夜夜夜做 | 亚洲午夜久久久久中文字幕久 | 91精品天美精东蜜桃传媒免费 | 仇爱电视剧泰剧在线观看免费播放 |