python3.6生成器yield用法實(shí)例分析
本文實(shí)例講述了python3.6生成器yield用法。分享給大家供大家參考,具體如下:
今天看源碼的時(shí)候看到了一個(gè)比較有意思的函數(shù):yield
功能與return類似,都是返回定義的函數(shù)的一個(gè)結(jié)果,不同的是return返回后這次調(diào)用函數(shù)就結(jié)束了,除了返回值,其余臨時(shí)變量都會(huì)被清除。而yield會(huì)停止在當(dāng)前步,并保留其余變量的值,等下次調(diào)用該函數(shù)時(shí),從yield的下一步繼續(xù)往下運(yùn)行。
yield的好處是如果函數(shù)需要很大的內(nèi)存,比方說(shuō)需要計(jì)算并返回一個(gè)很大的數(shù)列,如果用return,我們只能用一個(gè)list來(lái)存儲(chǔ)每一步再輸出,而用yield的話,只需要一個(gè)變量的內(nèi)存即可,每次輸出當(dāng)前步的值,下次調(diào)用函數(shù)接著從這一步繼續(xù)。
文字不太好說(shuō)明,看一個(gè)很容易理解的例子:(python3.6)
我們定義一個(gè)函數(shù)test(),看看return的效果
def test(n):
for i in range(n):
return i
print('mark')
測(cè)試結(jié)果
for i in range(5): print(test(3))
輸出
0
0
0
0
0
每次調(diào)用函數(shù)時(shí)碰到return就自動(dòng)結(jié)束了,返回當(dāng)前i值
再來(lái)看看yield的效果:
def test2(n):
for i in range(n):
yield i
print('mark')
測(cè)試
for i in range(5): print(test2(3))
輸出
<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>
<generator object test2 at 0x12d245200>
只要函數(shù)中含有yield,python就會(huì)默認(rèn)這個(gè)函數(shù)是一個(gè)生成器,這個(gè)測(cè)試相當(dāng)于重復(fù)打開了三次生成器
生成器需要用next()調(diào)用
測(cè)試
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')
測(cè)試
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)
<ipython-input-102-56e62df29d71> in <module>()
4 print(t2.send(2))
5 print('-----------')
----> 6 print(t2.send(3))StopIteration:
第一次next()返回1,并在當(dāng)前停止,send(2)會(huì)將2傳輸給當(dāng)前停止的那一步y(tǒng)ield處,即相當(dāng)于value = (yield 1)變?yōu)?code>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)典教程》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
淺談python中的@以及@在tensorflow中的作用說(shuō)明
這篇文章主要介紹了淺談python中的@以及@在tensorflow中的作用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
python爬取數(shù)據(jù)中的headers和代理IP問(wèn)題分析
這篇文章主要為大家介紹了python爬取數(shù)據(jù)中的headers和代理IP問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
對(duì)python判斷是否回文數(shù)的實(shí)例詳解
今天小編就為大家分享一篇對(duì)python判斷是否回文數(shù)的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
Python cookbook(數(shù)據(jù)結(jié)構(gòu)與算法)在字典中將鍵映射到多個(gè)值上的方法
這篇文章主要介紹了Python在字典中將鍵映射到多個(gè)值上的方法,涉及Python針對(duì)字典的相關(guān)映射與初始化相關(guān)操作技巧,需要的朋友可以參考下2018-02-02
pytorch實(shí)現(xiàn)mnist手寫彩色數(shù)字識(shí)別
這篇文章主要介紹了pytorch-實(shí)現(xiàn)mnist手寫彩色數(shù)字識(shí)別,文章圍繞主題展開詳細(xì)的內(nèi)容姐介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09
pycharm運(yùn)行OpenCV項(xiàng)目踩坑記錄
本文主要介紹了在PyCharm中運(yùn)行OpenCV項(xiàng)目時(shí)遇到的問(wèn)題及其解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下2025-03-03

