1. 程式人生 > >python yield和send

python yield和send

包含yield表示式的函式是特殊的函式,叫做生成器函式(generator function),被呼叫時將返回一個迭代器(iterator),呼叫時可以使用next或send(msg)。它的用法與return相似,區別在於它會記住上次迭代的狀態,繼續執行。 
send(msg)與next()的區別在於send可以傳遞引數給yield表示式,這時傳遞的引數會作為yield表示式的值,而yield的引數是返回給呼叫者的值。初始呼叫時必須先next()或send(None),否則會報錯。 

舉個例子: 
1.png
首先生成一個迭代器f,f.next()會使生成器函式執行到yield,生成一個值然後掛起。 
2.png
然後f.next()或f.send(msg)會在生成器函式內部返回值,執行到下一個yield,生成值後掛起 

3.png
然後f.next()或f.send(msg)會在生成器函式內部返回值,意圖執行到下一個yield,但是後面沒有yield了,所以丟擲異常。 

使用yield可以有效簡化程式碼,並減少空間浪費。 
舉個簡單例子:列表中的每個元素+1 
傳統寫法: 
Python程式碼
  1. def addlist(alist):   
  2.     r = []   
  3.     for i in alist:   
  4.         r.append(i+1)   
  5.     return r  
複製程式碼 yield寫法: 
Python程式碼
  1. def addlist(alist):     
  2.     for i in alist:     
  3.         yield i + 1   
複製程式碼 當然對於這種簡單的問題: 

Python程式碼
  1. [i+1 for i in alist]  
複製程式碼