本文實例講述了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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
