return 和yield的區別

2021-09-02 01:54:44 字數 2694 閱讀 9627

詳情請檢視:

對於新手來說,這兩個是容易讓人混淆的地方,這裡再梳理一遍

解釋一就像打電玩一樣,你蓄力發大招的時候,如果執行了return,就直接把大招發出去了,蓄力結束

如果執行了yield,就相當於返回乙個生成器物件,每呼叫一次next(),就發乙個大招

解釋二return是函式返回值,當執行到return,後續的邏輯**不在執行

yield是建立迭代器,可以用for來遍歷,有點事件觸發的意思

解釋三return是用來返回具體的某個值,yield一般與迴圈一起用,相當於生成了乙個容器(常見的就是字典),然後在這個容器裡面存放了每次迴圈以後的值,並且就在那放著,不輸出,不返回,等你下次需要他的時候直接取出來用(呼叫)就行

解釋四換個角度來說,從控制權來說。函式裡遇到return時,控制權交給主線程,然後沒這個函式什麼事了。如果遇到yield,控制權只是暫時交給主線程,函式繼續在那等著。另外,函式裡出現yield就自動變成生成器。

解釋五yield在寫爬蟲的時候用來迴圈獲取資料挺好用的

return:

做一件事,做到a節點的時候,碰到 『』return 拿出成果『』,那你就把成果拿出來,並且停止之後的事情。

yield:

做一件事,做到a節點的時候,碰到 『』yield 拿出成果『』,那你就把成果拿出來,拿出來之後,接著做後面的事情。

解釋六y和r所在的函式是兩個性質不同的函式。你可以理解為只要乙個函式包含yield語句,就不再是乙個函式了,而是變成了乙個具有迭代功能的生成器。所以你無法用執行語句的方法呼叫他,必須用nextsend函式進行呼叫。然後涉及到send傳遞的引數值就是yield表示式的值。也就是比如你執行了send(5來呼叫yield函式,此時yield函式中有個表示式a=yield 3,如果你此時列印a的值,a的值為5。還有就是yield返回值就是send語句的值。比如上面那個例子,你列印send(5),那麼它的值是3。

新手難以理解yield函式就是因為把生成器和普通的函式弄混了。可以說乙個yeild函式除了長得像函式,其他的地方幾乎沒有函式的影子。他只是起了乙個生成器的作用,多用於非同步或者遞迴。

**示例

#encoding:utf-8  

def yield_test(n):

for i in range(n):

yield call(i) # 它會立即把call(i)輸出,成果拿出來後才會進行下一步,所以 i, ',' 會先執行

print("i=",i) # 後執行

#做一些其它的事情

print("do something.") # 待執行,最後才執行一遍

print("end.")

def call(i):

return i*2

#使用for迴圈

for i in yield_test(5):

print(i,",") # 這裡的 i 是 call(i)

>>>        # 輸出的結果

0 ,

i= 0

2 ,

i= 1

4 ,

i= 2

6 ,

i= 3

8 ,

i= 4

do something.

end.

>>>

舉個簡單的例子,定義乙個generator,依次返回數字1,3,5:

def odd():

print('step 1')

yield 1

print('step 2')

yield(3)

print('step 3')

yield(5)

呼叫該generator時,首先要生成乙個generator物件,然後用next()函式不斷獲得下乙個返回值:

>>> o = odd()

>>> next(o)

step 1

1>>> next(o)

step 2

3>>> next(o)

step 3

5>>> next(o)

traceback (most recent call last):

file "", line 1, in stopiteration

可以看到,odd不是普通函式,而是generator,在執行過程中,遇到yield就中斷,下次又繼續執行。執行3次yield後,已經沒有yield可以執行了,所以,第4次呼叫next(o)就報錯。

Python中return和yield的區別

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

Python中return和yield的區別

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

Python中return和yield的區別

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