python 如何區(qū)分return和yield
一、說(shuō)明
return一直中,每中語(yǔ)言中其沒沒有很大差別,就不多說(shuō)了。(shell語(yǔ)言return的是退出狀態(tài),可能差別是比較大的,感興趣可參見“Linux Shell函數(shù)定義與調(diào)用”)
最早看到y(tǒng)ield應(yīng)該是哪們語(yǔ)言用來(lái)調(diào)整什么線程優(yōu)先級(jí)的,記不清了,不過(guò)那里的yield和python中的yield應(yīng)該功能有區(qū)別。
python中最早看到y(tǒng)ield應(yīng)該是使用scrapy框架寫爬蟲的時(shí)候,之前也有去看yiled的用法,總記不太住。今天又去看了一下,基本上來(lái)就是講些斐波那契數(shù)列的煩的要死,自己寫段程序研究了一下,這里記一下。
二、return和yield的異同
共同點(diǎn):return和yield都用來(lái)返回值;在一次性地返回所有值場(chǎng)景中return和yield的作用是一樣的。
不同點(diǎn):如果要返回的數(shù)據(jù)是通過(guò)for等循環(huán)生成的迭代器類型數(shù)據(jù)(如列表、元組),return只能在循環(huán)外部一次性地返回,yeild則可以在循環(huán)內(nèi)部逐個(gè)元素返回。下邊我們舉例說(shuō)明這個(gè)不同點(diǎn)。
三、實(shí)例說(shuō)明
3.1 return版本
示例代碼如下:
class TestYield:
def gen_iterator(self):
result_list = []
for j in range(3):
print(f"gen_iterator-{j}")
result_list.append(j)
# return在循環(huán)的外部,待變量完全生成后一次性返回
return result_list
def call_gen_iterator(self):
# 執(zhí)行下邊這句后result_list直接是完成的結(jié)果[0,1,2]
result_list = self.gen_iterator()
for i in result_list:
print(f"call_gen_iterator-{i}")
if __name__ == "__main__":
obj = TestYield()
obj.call_gen_iterator()
執(zhí)行結(jié)果如下,可以看到一次性執(zhí)行完下層函數(shù),生成完整的迭代器類型返回值result_list,一次性返回給上層函數(shù):

3.2 yield版本
示例代碼如下:
class TestYield:
def gen_iterator(self):
for j in range(3):
print(f"do_something-{j}")
# yield在for循環(huán)內(nèi)部
yield j
def call_gen_iterator(self):
# yield并不是直接返回[0,1,2],執(zhí)行下邊這句后result_list什么值都沒有
result_list = self.gen_iterator()
# i每請(qǐng)求一個(gè)數(shù)據(jù),才會(huì)觸發(fā)gen_iterator生成一個(gè)數(shù)據(jù)
for i in result_list:
print(f"call_gen_iterator-{i}")
if __name__ == "__main__":
obj = TestYield()
obj.call_gen_iterator()
執(zhí)行結(jié)果如下,可以看到上下層函數(shù)是交替進(jìn)行的,即上層函數(shù)請(qǐng)求迭代一個(gè)值下層函數(shù)才生成一個(gè)值并立即返回這個(gè)值:

3.3 yield的意義
從上邊兩個(gè)小節(jié)可以看到,雖然return和yield兩者執(zhí)行的順序有區(qū)別,但整個(gè)要做的事情是一樣的,所以使用yield并不會(huì)比return快,甚至我們可以猜測(cè)由于yield總發(fā)生上下文切換在速度上還會(huì)慢一些,所以速度不是yield的意義。
他們的主要區(qū)別是yiled要迭代到哪個(gè)元素那個(gè)元素才即時(shí)地生成,而return要用一個(gè)中間變量result_list保存返回值,當(dāng)result_list的長(zhǎng)度很長(zhǎng)且每個(gè)組成元素內(nèi)容很大時(shí)將會(huì)耗費(fèi)比較大的內(nèi)存,此時(shí)yield相對(duì)return才有優(yōu)勢(shì)。
四、yield和return嵌套使用
class TestYield:
def gen_iterator(self):
for j in range(3):
print(f"do_something-{j}")
# yield在for循環(huán)內(nèi)部
yield j
def gen_iterator_middle(self):
print(f"gen_iterator_middle")
# 返回的是迭代器的句柄,所以加一層return不影響是可以理解的
return self.gen_iterator()
def call_gen_iterator(self):
# yield并不是直接返回[0,1,2],執(zhí)行下邊這句后result_list什么值都沒有
result_list = self.gen_iterator_middle()
# i每請(qǐng)求一個(gè)數(shù)據(jù),才會(huì)觸發(fā)gen_iterator生成一個(gè)數(shù)據(jù)
for i in result_list:
print(f"call_gen_iterator-{i}")
if __name__ == "__main__":
obj = TestYield()
obj.call_gen_iterator()

以上就是python 如何區(qū)分return和yield的詳細(xì)內(nèi)容,更多關(guān)于python return和yield的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決Python安裝時(shí)報(bào)缺少DLL問題【兩種解決方法】
這篇文章主要介紹了解決Python安裝時(shí)報(bào)缺少DLL問題,本文通過(guò)兩種方法給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-07-07
淺談python的dataframe與series的創(chuàng)建方法
今天小編就為大家分享一篇淺談python的dataframe與series的創(chuàng)建方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
如何用Python繪制簡(jiǎn)易動(dòng)態(tài)圣誕樹
這篇文章主要給大家介紹了關(guān)于如何用Python繪制簡(jiǎn)易動(dòng)態(tài)圣誕樹,文中講解了如何通過(guò)編寫代碼來(lái)實(shí)現(xiàn)特定的效果,包括代碼的編寫技巧和效果的展示,需要的朋友可以參考下2025-01-01
python pip安裝包出現(xiàn):Failed building wheel for xxx錯(cuò)誤的解決
今天小編就為大家分享一篇python pip安裝包出現(xiàn):Failed building wheel for xxx錯(cuò)誤的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12

