今天在看Python書籍的時候,有段代碼中用到了 yield 關鍵字,不知道作什么用,不甚理解。查了些資料,覺得 yield 挺好用的,給大家分享下:
在Python3中任何使用到 yield 的函數稱為生成器,如:
def count(n): while n > 0: yield n # 生成值: n n -= 1
另外一種說法:生成器就是一個返回迭代器的函數,與普通函數的區別是生成器包含yield語句,更簡單點理解生成器就是一個迭代器。
使用yield,可以讓函數生成一個序列,該函數返回的對象類型是"generator",通過該對象連續調用__next__()方法返回序列值。
def count(n): while n > 0: yield n # 生成值: n n -= 1 c = count(5) print(c.__next__()) # 輸出:5 print(c.__next__()) # 輸出:4
生成器函數只有在調用__next()__方法的時候才開始執行函數里面的語句,比如:增加打印輸出
def count(n): print("bgn...") while n > 0: yield n # 生成值: n n -= 1
在調用count函數時:c=count(5),並不會打印"bgn..."。只有等到調用c.__next__()時才真正執行里面的語句。每次調用__next__()方法時,count函數會運行到語句yield n處為止,__next__()的返回值就是生成值n,再次調用__next__()方法時,函數繼續執行yield之后的語句。
從上面輸出可以看出,調用了2次 c.__next__,“bgn...”只輸出一次,“end...”沒有輸出。“end...”只有在迭代器的值都迭代完成才會輸出。如果一直調用__next__方法,當執行到沒有可迭代的值后,程序就會報錯:
Traceback (most recent call last):
所以一般不會手動的調用__next__方法,而使用for循環,完整代碼如下:
def count(n): print("bgn...") while n > 0: yield n # 生成值: n n -= 1 print("end...") for i in count(5): print(i)
輸出如下: