詳情請檢視:
對於新手來說,這兩個是容易讓人混淆的地方,這裡再梳理一遍
解釋一就像打電玩一樣,你蓄力發大招的時候,如果執行了return
,就直接把大招發出去了,蓄力結束
如果執行了yield
,就相當於返回乙個生成器物件,每呼叫一次next()
,就發乙個大招
解釋二return
是函式返回值,當執行到return
,後續的邏輯**不在執行
yield
是建立迭代器,可以用for
來遍歷,有點事件觸發的意思
解釋三return
是用來返回具體的某個值,yield
一般與迴圈一起用,相當於生成了乙個容器(常見的就是字典),然後在這個容器裡面存放了每次迴圈以後的值,並且就在那放著,不輸出,不返回,等你下次需要他的時候直接取出來用(呼叫)就行
解釋四換個角度來說,從控制權來說。函式裡遇到return
時,控制權交給主線程,然後沒這個函式什麼事了。如果遇到yield
,控制權只是暫時交給主線程,函式繼續在那等著。另外,函式裡出現yield
就自動變成生成器。
解釋五yield
在寫爬蟲的時候用來迴圈獲取資料挺好用的
return:
做一件事,做到a節點的時候,碰到 『』return 拿出成果『』,那你就把成果拿出來,並且停止之後的事情。
yield:
做一件事,做到a節點的時候,碰到 『』yield 拿出成果『』,那你就把成果拿出來,拿出來之後,接著做後面的事情。
解釋六y和r所在的函式是兩個性質不同的函式。你可以理解為只要乙個函式包含yield
語句,就不再是乙個函式了,而是變成了乙個具有迭代功能的生成器。所以你無法用執行語句的方法呼叫他,必須用next
和send
函式進行呼叫。然後涉及到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應該功能...