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

您的位置:首頁技術文章
文章詳情頁

python 如何區分return和yield

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

一、說明

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

最早看到yield應該是哪們語言用來調整什么線程優先級的,記不清了,不過那里的yield和python中的yield應該功能有區別。

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

二、return和yield的異同

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

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

三、實例說明

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在循環的外部,待變量完全生成后一次性返回 return result_list def call_gen_iterator(self): # 執行下邊這句后result_list直接是完成的結果[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()

執行結果如下,可以看到一次性執行完下層函數,生成完整的迭代器類型返回值result_list,一次性返回給上層函數:

python 如何區分return和yield

3.2 yield版本

示例代碼如下:

class TestYield: def gen_iterator(self): for j in range(3): print(f'do_something-{j}') # yield在for循環內部 yield j def call_gen_iterator(self): # yield并不是直接返回[0,1,2],執行下邊這句后result_list什么值都沒有 result_list = self.gen_iterator() # i每請求一個數據,才會觸發gen_iterator生成一個數據 for i in result_list: print(f'call_gen_iterator-{i}')if __name__ == '__main__': obj = TestYield() obj.call_gen_iterator()

執行結果如下,可以看到上下層函數是交替進行的,即上層函數請求迭代一個值下層函數才生成一個值并立即返回這個值:

python 如何區分return和yield

3.3 yield的意義

從上邊兩個小節可以看到,雖然return和yield兩者執行的順序有區別,但整個要做的事情是一樣的,所以使用yield并不會比return快,甚至我們可以猜測由于yield總發生上下文切換在速度上還會慢一些,所以速度不是yield的意義。

他們的主要區別是yiled要迭代到哪個元素那個元素才即時地生成,而return要用一個中間變量result_list保存返回值,當result_list的長度很長且每個組成元素內容很大時將會耗費比較大的內存,此時yield相對return才有優勢。

四、yield和return嵌套使用

class TestYield: def gen_iterator(self): for j in range(3): print(f'do_something-{j}') # yield在for循環內部 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],執行下邊這句后result_list什么值都沒有 result_list = self.gen_iterator_middle() # i每請求一個數據,才會觸發gen_iterator生成一個數據 for i in result_list: print(f'call_gen_iterator-{i}')if __name__ == '__main__': obj = TestYield() obj.call_gen_iterator()

python 如何區分return和yield

以上就是python 如何區分return和yield的詳細內容,更多關于python return和yield的資料請關注好吧啦網其它相關文章!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 国产精品黄网站免费进入 | 成 人 黄 色 视频播放16 | 久久不卡日韩美女 | 成人网18免费软件大全 | 久久综合免费视频 | 欧美国产亚洲一区 | 一级视频在线 | 国产亚洲精品2021自在线 | 亚洲国产精品二区久久 | 久久免费精品国产视频 | 一区二区影院 | 在线观看免费国产 | 99青青| a一级毛片免费高清在线 | 性色欧美xo影院 | 91久久99热青草国产 | 久草免费色站 | 亚洲日本一区二区三区在线 | 欧美性活一级视频 | 欧美高清在线精品一区 | 福利视频在线午夜老司机 | 4四虎44虎www在线影院麻豆 | 久草久在线 | 国产精品久久久久久久 | 日韩专区在线 | 国产色司机在线视频免费观看 | 91精品一区二区三区在线 | 国产在线欧美精品 | 一区二区网站在线观看 | 97国产在线观看 | 美国毛片视频 | 草在线视频 | 特级做人爱c级特级aav毛片 | 在线精品一区二区三区 | 怡红院视频网 | 成人久久久久久 | 日本a级精品一区二区三区 日本a级毛片免费视频播放 | 精品呦女 | 在线观看不卡一区 | 精品久久久久久久高清 | 久久精品免视着国产成人 |