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後,生成器沒有繼續執行,而第二個迴圈接著第一個迴圈執行
以上是Python中yield用法詳細說明的詳細內容。更多資訊請關注PHP中文網其他相關文章!