Python中return和yield的區別

2021-10-09 16:07:03 字數 2541 閱讀 9351

在函式中,結束該函式的執行,return 後面的**塊不會執行,返回該函式的執行結果。

帶有yield的函式是乙個迭代器,函式返回某個值時,會停留在某個位置,返回函式值後,會在前面停留的位置繼續執行,直到程式結束

該物件可以迭代遍歷和通過next()方法取出物件中的值。比較節約記憶體空間。儲存的是生成資料的方式。可以達到隨用隨取的效果。

看下面的程式:

def foo():

print("starting...")

while true:

res = yield 4

print("res:", res)

g = foo()

print(next(g))

print("*" * 20)

print(next(g))

**的輸出結果:

starting...

4********************

res: none

4解釋**執行順序:

1.程式開始執行以後,因為foo函式中有yield關鍵字,所以foo函式並不會真的執行,而是先得到乙個生成器g(相當於乙個物件)

2.直到呼叫next方法,foo函式正式開始執行,先執行foo函式中的print方法,然後進入while迴圈

3.程式遇到yield關鍵字,然後把yield想想成return,return了乙個4之後,程式停止,並沒有執行賦值給res操作,此時next(g)語句執行完成,所以輸出的前兩行(第乙個是while上面的print的結果,第二個是return出的結果)是執行print(next(g))的結果,

4.程式執行print("*"20),輸出20個

5.又開始執行下面的print(next(g)),這個時候和上面那個差不多,不過不同的是,這個時候是從剛才那個next程式停止的地方開始執行的,也就是要執行res的賦值操作,這時候要注意,這個時候賦值操作的右邊是沒有值的(因為剛才那個是return出去了,並沒有給賦值操作的左邊傳引數),所以這個時候res賦值是none,所以接著下面的輸出就是res:none,

6.程式會繼續在while裡執行,又一次碰到yield,這個時候同樣return 出4,然後程式停止,print函式輸出的4就是這次return出的4.

到這裡你可能就明白yield和return的關係和區別了,帶yield的函式是乙個生成器,而不是乙個函式了,這個生成器有乙個函式就是next函式,next就相當於「下一步」生成哪個數,這一次的next開始的地方是接著上一次的next停止的地方執行的,所以呼叫next的時候,生成器並不會從foo函式的開始執行,只是接著上一步停止的地方開始,然後遇到yield後,return出要生成的數,此步就結束。

再看乙個這個生成器的send函式的例子:

def foo():

print("starting...")

while true:

res = yield 4

print("res:",res)

g = foo()

print(next(g))

print("*"*20)

print(g.send(7))

**的輸出結果:

starting...

4********************

res: 7

4send是傳送乙個引數給res的,因為上面講到,return的時候,並沒有把4賦值給res,下次執行的時候只好繼續執行賦值操作,只好賦值為none了,而如果用send的話,開始執行的時候,先接著上一次(return 4之後)執行,先把7賦值給了res,然後執行next的作用,遇見下一回的yield,return出結果後結束。

1.程式執行g.send(7),程式會從yield關鍵字那一行繼續向下執行,send會把7這個值賦值給res變數

2.由於send方法中包含next()方法,所以程式會繼續向下執行執行print方法,然後再次進入while迴圈

3.程式執行再次遇到yield關鍵字,yield會返回後面的值後,程式再次暫停,直到再次呼叫next方法或send方法。

這就結束了。這種方式比較節約記憶體空間。儲存的是生成資料的方式。可以達到隨用隨取的效果。

def foo(num):

print("starting...")

while num < 10:

num = num + 1

yield num

for n in foo(0):

print(n)

**的輸出結果:

starting...12

3456

78910

return對應的是普通函式,執行完畢以後控制權移交給父函式,函式的上下文就此銷毀;

yeild對應的是乙個具有迭代功能的生成器。無法用執行語句的方法呼叫它,必須用next()和send()函式進行呼叫。

next() 呼叫使生成器函式一直執行到下一條yield語句為止, 此時next()將返回值傳遞給yield,而且函式將暫時中止執行,再次呼叫next()時,函式將繼續執行yield之後的語句。此過程將持續到函式返回為止。通常會使用乙個for迴圈呼叫next()。

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的區別

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

Python中return和yield的區別

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