国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

python 如何區(qū)分return和yield

瀏覽:3日期:2022-07-10 13:32:11

一、說明

return一直中,每中語言中其沒沒有很大差別,就不多說了。(shell語言return的是退出狀態(tài),可能差別是比較大的,感興趣可參見“Linux Shell函數(shù)定義與調(diào)用”)

最早看到y(tǒng)ield應(yīng)該是哪們語言用來調(diào)整什么線程優(yōu)先級(jí)的,記不清了,不過那里的yield和python中的yield應(yīng)該功能有區(qū)別。

python中最早看到y(tǒng)ield應(yīng)該是使用scrapy框架寫爬蟲的時(shí)候,之前也有去看yiled的用法,總記不太住。今天又去看了一下,基本上來就是講些斐波那契數(shù)列的煩的要死,自己寫段程序研究了一下,這里記一下。

二、return和yield的異同

共同點(diǎn):return和yield都用來返回值;在一次性地返回所有值場(chǎng)景中return和yield的作用是一樣的。

不同點(diǎn):如果要返回的數(shù)據(jù)是通過for等循環(huán)生成的迭代器類型數(shù)據(jù)(如列表、元組),return只能在循環(huán)外部一次性地返回,yeild則可以在循環(huán)內(nèi)部逐個(gè)元素返回。下邊我們舉例說明這個(gè)不同點(diǎn)。

三、實(shí)例說明

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ù):

python 如何區(qū)分return和yield

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è)值:

python 如何區(qū)分return和yield

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的長度很長且每個(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

以上就是python 如何區(qū)分return和yield的詳細(xì)內(nèi)容,更多關(guān)于python return和yield的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 国产永久免费高清动作片www | 72种姿势欧美久久久久大黄蕉 | 九九九九热精品视频 | 全部孕妇毛片丰满孕妇孕交 | 久久亚洲网| 91精品国产美女福到在线不卡 | 伊人情人综合网 | 欧美精品高清在线观看 | 色视频www在线播放国产人成 | 国产区网址 | 男女毛片免费视频看 | 一级毛片在线观看视频 | 亚洲欧美网址 | 欧美大片一级特黄 | 亚州综合网| 国产亚洲精品久久久久91网站 | 欧美成本人视频 | 99久久精品免费看国产一区二区三区 | 美女拍拍拍爽爽爽爽爽爽 | 99精品视频在线在线视频观看 | 国产一区二区三区四区波多野结衣 | 亚洲综合影视 | 久草在线免费色站 | 久久久久久久性高清毛片 | 成年女人黄小视频 | 亚洲影视一区二区 | 绝对真实偷拍盗摄高清在线视频 | 香蕉视频911 | 纯欧美一级毛片_免费 | 亚洲精品久久九九精品 | 国产成人综合网亚洲欧美在线 | 日本一级爽毛片在线看 | 亚洲欧美一区二区三区在线播放 | 国产精品拍拍拍福利在线观看 | 亚洲 欧美 国产 日韩 制服 bt | 国产成人啪精品午夜在线观看 | 成人自拍小视频 | 免费国产在线观看 | 男人女人真曰批视频播放 | 国内精品久久久久久久aa护士 | 亚洲一区二区三区不卡视频 |