亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python3.6生成器yield用法實(shí)例分析

系統(tǒng) 1758 0

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

今天看源碼的時(shí)候看到了一個(gè)比較有意思的函數(shù):yield

功能與return類似,都是返回定義的函數(shù)的一個(gè)結(jié)果,不同的是return返回后這次調(diào)用函數(shù)就結(jié)束了,除了返回值,其余臨時(shí)變量都會被清除。而yield會停止在當(dāng)前步,并保留其余變量的值,等下次調(diào)用該函數(shù)時(shí),從yield的下一步繼續(xù)往下運(yùn)行。

yield的好處是如果函數(shù)需要很大的內(nèi)存,比方說需要計(jì)算并返回一個(gè)很大的數(shù)列,如果用return,我們只能用一個(gè)list來存儲每一步再輸出,而用yield的話,只需要一個(gè)變量的內(nèi)存即可,每次輸出當(dāng)前步的值,下次調(diào)用函數(shù)接著從這一步繼續(xù)。

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

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

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


          

測試結(jié)果

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


          

輸出

0
0
0
0
0

每次調(diào)用函數(shù)時(shí)碰到return就自動結(jié)束了,返回當(dāng)前i值

再來看看yield的效果:

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

          

測試

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


          

輸出



只要函數(shù)中含有yield,python就會默認(rèn)這個(gè)函數(shù)是一個(gè)生成器,這個(gè)測試相當(dāng)于重復(fù)打開了三次生成器

生成器需要用 next() 調(diào)用

測試

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

          

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

結(jié)果

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

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

生成器還支持用 send() 將值傳遞進(jìn)函數(shù):

            
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,并在當(dāng)前停止,send(2)會將2傳輸給當(dāng)前停止的那一步y(tǒng)ield處,即相當(dāng)于 value = (yield 1) 變?yōu)? value = (2)

然后繼續(xù)運(yùn)行

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


          

碰到y(tǒng)ield再次停止,返回此時(shí)的vlue值2,之后 send(3) 將3傳輸給當(dāng)前停止那一步y(tǒng)ield處,即第二個(gè) yield value 處,繼續(xù)運(yùn)行

            
print(value)
print('mark2')


          

生成器運(yùn)行結(jié)束后生成StopIteration

更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程》

希望本文所述對大家Python程序設(shè)計(jì)有所幫助。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 老子影院午夜精品欧美视频 | 在线亚洲精品国产波多野结衣 | 国产91在线播放边 | 你懂的日韩 | 亚洲精品国产字幕久久不卡 | 色婷婷影视 | 一级淫片免费看 | 亚洲精品国产成人 | 午夜国产精品久久影院 | 久青草国产在线视频亚瑟影视 | 欧美美妇性较大毛片 | 成人精品一区二区www | 国产成人精品曰本亚洲77美色 | 久久免费精品高清麻豆 | 日韩伦理亚洲欧美在线一区 | 亚洲综合极品香蕉久久网 | 视频三区精品中文字幕 | 婷婷色香五月激情综合2020 | 精品九九久久国内精品 | 日韩精品一区二区三区免费观看 | 国产成人综合在线视频 | 国产99视频精品免视看7 | 麻豆国产在线不卡一区二区 | 欧美aaaaa一级毛片在线 | jizz中国妇女| 欧美日韩一区二区综合在线视频 | 四虎国产精品成人永久免费影视 | 成人免费淫片免费观看 | a毛片基地| 免费真实播放国产乱子伦 | 人成在线免费视频 | 毛片你懂的 | 久久精品视频免费观看 | 亚洲国产欧美在线不卡中文 | 亚洲综合极品香蕉久久网 | 99热这里只有精品免费国产 | 国内视频自拍 | 91热成人精品国产免费 | 看看一级毛片 | 久久这里只有 | 日韩精品一区二区三区四区 |