您好,登錄后才能下訂單哦!
這篇文章主要講解了“Python3中return和yield的區別是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Python3中return和yield的區別是什么”吧!
return一直中,每中語言中其沒沒有很大差別,就不多說了。(shell語言return的是退出狀態,可能差別是比較大的)最早看到yield應該是哪們語言用來調整什么線程優先級的,記不清了,不過那里的yield和python中的yield應該功能有區別。
共同點:return和yield都用來返回值;在一次性地返回所有值場景中return和yield的作用是一樣的。
不同點:如果要返回的數據是通過for等循環生成的迭代器類型數據(如列表、元組),return只能在循環外部一次性地返回,yeild則可以在循環內部逐個元素返回。下邊我們舉例說明這個不同點。
示例代碼如下:
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,一次性返回給上層函數:
示例代碼如下:
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()
執行結果如下,可以看到上下層函數是交替進行的,即上層函數請求迭代一個值下層函數才生成一個值并立即返回這個值:
從上邊兩個小節可以看到,雖然return和yield兩者執行的順序有區別,但整個要做的事情是一樣的,所以使用yield并不會比return快,甚至我們可以猜測由于yield總發生上下文切換在速度上還會慢一些,所以速度不是yield的意義。
他們的主要區別是yiled要迭代到哪個元素那個元素才即時地生成,而return要用一個中間變量result_list保存返回值,當result_list的長度很長且每個組成元素內容很大時將會耗費比較大的內存,此時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()
感謝各位的閱讀,以上就是“Python3中return和yield的區別是什么”的內容了,經過本文的學習后,相信大家對Python3中return和yield的區別是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。