1、概念html
生成器是一類用來簡化編寫迭代器工做的特殊函數。普通的函數計算並返回一個值,而生成器返回一個能返回數據流的迭代器。python
毫無疑問,你已經對如何在 Python 和 C 中調用普通函數很熟悉了,這時候函數會得到一個建立局部變量的私有命名空間。當函數到達 return
表達式時,局部變量會被銷燬而後把返回給調用者。以後調用一樣的函數時會建立一個新的私有命名空間和一組全新的局部變量。可是,若是在退出一個函數時不扔掉局部變量會如何呢?若是稍後你可以從退出函數的地方從新恢復又如何呢?這就是生成器所提供的;他們能夠被當作可恢復的函數。express
任何包含了 yield
關鍵字的函數都是生成器函數;Python 的 bytecode 編譯器會在編譯的時候檢測到並所以而特殊處理。函數
當你調用一個生成器函數,它並不會返回單獨的值,而是返回一個支持生成器協議的生成器對象。當執行 yield
表達式時,生成器會輸出 i
的值,就像 return
表達式同樣。yield
和 return
最大的區別在於,到達 yield
的時候生成器的執行狀態會掛起並保留局部變量。在下一次調用生成器 __next__()
方法的時候,函數會恢復執行。spa
這裏有一個 generate_ints()
生成器的示例:code