天天看點

[Python]yield用法入門

包含yield表達式的函數是特殊的函數,叫做生成器函數(generator function),被調用時将傳回一個疊代器(iterator),調用時可以使用next或send(msg)。它的用法與return相似,差別在于它會記住上次疊代的狀态,繼續執行。 

send(msg)與next()的差別在于send可以傳遞參數給yield表達式,這時傳遞的參數會作為yield表達式的值,而yield的參數是傳回給調用者的值。初始調用時必須先next()或send(None),否則會報錯。 

舉個例子: 

[Python]yield用法入門

首先生成一個疊代器f,f.next()會使生成器函數執行到yield,生成一個值然後挂起。 

[Python]yield用法入門

然後f.next()或f.send(msg)會在生成器函數内部傳回值,執行到下一個yield,生成值後挂起 

[Python]yield用法入門

然後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]  

複制代碼