包含yield表達式的函數是特殊的函數,叫做生成器函數(generator function),被調用時将傳回一個疊代器(iterator),調用時可以使用next或send(msg)。它的用法與return相似,差別在于它會記住上次疊代的狀态,繼續執行。
send(msg)與next()的差別在于send可以傳遞參數給yield表達式,這時傳遞的參數會作為yield表達式的值,而yield的參數是傳回給調用者的值。初始調用時必須先next()或send(None),否則會報錯。
舉個例子:

首先生成一個疊代器f,f.next()會使生成器函數執行到yield,生成一個值然後挂起。
然後f.next()或f.send(msg)會在生成器函數内部傳回值,執行到下一個yield,生成值後挂起
然後f.next()或f.send(msg)會在生成器函數内部傳回值,意圖執行到下一個yield,但是後面沒有yield了,是以抛出異常。
使用yield可以有效簡化代碼,并減少空間浪費。
舉個簡單例子:清單中的每個元素+1
傳統寫法:
Python代碼
- def addlist(alist):
- r = []
- for i in alist:
- r.append(i+1)
- return r
複制代碼 yield寫法:
Python代碼
- def addlist(alist):
- for i in alist:
- yield i + 1
複制代碼 當然對于這種簡單的問題:
Python代碼
- [i+1 for i in alist]
複制代碼