Python中yeild的用法詳解

2021-10-13 12:31:51 字數 2253 閱讀 6953

python中yeild的用法詳解

初步認識:先把yield看做return

return:在程式中返回某個值,返回後程式就不再往下執行了

**:

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

**解釋:

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

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

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

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

再次執行print(next(g)),此時從next程式停止的地方開始執行。執行res的賦值操作,此時賦值操作的右邊是沒有值的(因為剛才那個被return出去了,並沒有給賦值操作的左邊傳引數),所以這個時候res賦值是none,所以輸出res:none

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

總結

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

再認識:yield是生成器(generator)的一部分(帶yield的函式才是真正的迭代器)

**:

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

4

**解釋:

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

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

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

合理使用

取0,1,2,3,… 1000:

**

for n in range(1000):

a = n

此時,range(1000)就預設生成了乙個含有1000個數的list,所以很佔記憶體。

可以用剛才的yield組合生成器進行實現:

def foo(num):

print("starting...")

while num<10:

num=num+1

yield num

for n in foo(0):

print(n)

也可以用xrange(1000)這個生成器實現:

for n in range(1000):

a=n注意:python3時已經沒有xrange()了,在python3中range()就是xrange()

python之生成器yeild

思考 首先思考這樣乙個問題 建立乙個列表,但是記憶體受限,容量一定是有限的。那麼如果建立了乙個包含100萬個元素的列表,不僅占用很大的儲存空間,而我們僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了?這個時候就需要乙個容器,在我們需要資料的時候拿出來,不取資料的時候就釋放掉。這樣就...

python生成器 yeild關鍵字

1.yeild版本的斐波那契數列 def fab max n,a,b 0,0,1 while n max yield b print b a,b b,a b n n 1 第四個版本的 fab 和第一版相比,僅僅把 print b 改為了 yield b,就在保持簡潔性的同時獲得了 iterable ...

yeild的一些使用

參考 1,yield就好比是生成迭代器的關鍵字,迭代器在需要的時候才會去拿資料,所以,第二段 會報錯,對於第一段 list本身就是全部放到記憶體中的。the list 2 x for x in range 5 print type the list print len the list the ge...