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