首頁  >  文章  >  後端開發  >  Python- yield 用法詳解

Python- yield 用法詳解

高洛峰
高洛峰原創
2016-10-19 11:43:561299瀏覽

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

acb

bac

bca

cab

cba

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:Python是訊號量下一篇:Python是訊號量