Python yield 用法

鴨脖發表於2012-04-24

yield 用法說明

yield 簡單說來就是一個生成器生成器是這樣一個函式,它記住上一次返回時在函式體中的位置。對生成器函式的第二次(或第 n 次)呼叫跳轉至該函式中間,而上次呼叫的所有區域性變數都保持不變。

  • 生成器 是 一個函式

函式的所有引數都會保留

  • 第二次呼叫 此函式 時

使用的引數是前一次保留下的.

  • 生成器還“記住”了它在流控制構造

生成器不僅“記住”了它資料狀態。 生成器還“記住”了它在流控制構造(在指令式程式設計中,這種構造不只是資料值)中的位置。由於連續性使您在執行框架間任意跳轉,而不總是返回到直接呼叫者的上下文(如同生成器那樣),因此它仍是比較一般的。

yield 生成器的執行機制

當你問生成器要一個數時,生成器會執行,直至出現 yield 語句,生成器把 yield 的引數給你,之後生成器就不會往下繼續執行。 當你問他要下一個數時,他會從上次的狀態開始執行,直至出現yield語句,把引數給你,之後停下。如此反覆直至退出函式。

例子:Python 排列,組合生成器

#生成全排列
def perm(items, n=None):
    if n is None:
        n = len(items)
    for i in range(len(items)):
        v = items[i:i+1]
        if n == 1:
            yield v
        else:
            rest = items[:i] + items[i+1:]
            for p in perm(rest, n-1):
                yield v + p
 
#生成組合
def comb(items, n=None):
    if n is None:
        n = len(items)    
    for i in range(len(items)):
        v = items[i:i+1]
        if n == 1:
            yield v
        else:
            rest = items[i+1:]
            for c in comb(rest, n-1):
                yield v + c
 
a = perm('abc')
for b in a:
    print b
    break
print '-'*20
for b in a:
    print b 

結果如下:

102 pvopf006 ~/test> ./generator.py
abc
--------------------
acb
bac
bca
cab
cba

可以看到,在第一個迴圈break後,生成器沒有繼續執行,而第二個迴圈接著第一個迴圈執行

相關文章