Python中return和yield的區別

2021-10-20 19:20:45 字數 2838 閱讀 8701

一、說明

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

二、return和yield的異同

三、例項說明

1 return版本

示例**如下:

class

testyield

:def

gen_iterator

(self)

: result_list =

for j in

range(3

):print

(f"gen_iterator-"

)# return在迴圈的外部,待變數完全生成後一次性返回

return result_list

defcall_gen_iterator

(self)

:# 執行下邊這句後result_list直接是完成的結果[0,1,2]

result_list = self.gen_iterator(

)for i in result_list:

print

(f"call_gen_iterator-"

)if __name__ ==

"__main__"

: obj = testyield(

) obj.call_gen_iterator(

)

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

2 yield版本

示例**如下:

'''

'''class

testyield

:def

gen_iterator

(self)

:for j in

range(3

):print

(f"do_something-"

)# yield在for迴圈內部

yield j

defcall_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-"

)if __name__ ==

"__main__"

: obj = testyield(

) obj.call_gen_iterator(

)

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

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-"

)# yield在for迴圈內部

yield j

defgen_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生成乙個資料

Python中return和print的作用及區別

print的作用是輸出資料到控制端,就是列印在你能看到的介面上 print的作用還是比較容易理解的 print 1 print asdfghj 輸出結果 1asdfghjreturn的作用之一是返回計算的值 沒有return語句 x 1y 2def add x,y z x y print add x...

Python中return和yield的區別

在函式中,結束該函式的執行,return 後面的 塊不會執行,返回該函式的執行結果。帶有yield的函式是乙個迭代器,函式返回某個值時,會停留在某個位置,返回函式值後,會在前面停留的位置繼續執行,直到程式結束 該物件可以迭代遍歷和通過next 方法取出物件中的值。比較節約記憶體空間。儲存的是生成資料...

Python中return和yield的區別

return一直中,每中語言中其沒沒有很大差別,就不多說了。shell語言return的是退出狀態,可能差別是比較大的,感興趣可參見 linux shell函式定義與呼叫 最早看到yield應該是哪們語言用來調整什麼執行緒優先順序的,記不清了,不過那裡的yield和python中的yield應該功能...