Python Generators(生成器)
生成器是這樣一個函式,它記住上一次返回時在函式體中的位置。對生成器函式的第二次(或第 n 次)呼叫跳轉至該函式中間,而上次呼叫的所有區域性變數都保持不變。
生成器不僅“記住”了它資料狀態;生成器還“記住”了它在流控制構造(在指令式程式設計中,這種構造不只是資料值)中的位置。
生成器的特點:
生成器是一個函式,而且函式的引數都會保留。
迭代到下一次的呼叫時,所使用的引數都是第一次所保留下的,即是說,在整個所有函式呼叫的引數都是第一次所呼叫時保留的,而不是新建立的
在Python中,yield就是這樣的一個生成器。
yield 生成器的執行機制:
當你問生成器要一個數時,生成器會執行,直至出現 yield 語句,生成器把
yield 的引數給你,之後生成器就不會往下繼續執行。 當你問他要下一個數時,他會從上次的狀態。開始執行,直至出現yield語句,把引數給你,之後停下。如此反覆直至退出函式。(以上關於yield的描述,在後面列舉一個簡單的例子來解釋這段話)
yield的使用:
在python中,當你定義一個函式,使用了yield關鍵字時,這個函式就是一個生成器,它的執行會和其他普通的函式有很多不同,函式返回的是一個物件,而不是你平常所用return語句那樣,能得到結果值。如果想取得值,那得呼叫next()函式,如:
每當呼叫一次迭代器的next函式,生成器函式執行到yield之處,返回yield後面的值且在這個地方暫停,所有的狀態都會被保持住,直到下次next函式被呼叫,或者碰到異常迴圈退出。
下面,來看看以下的例子程式碼吧,是用來說明yield執行機制的。
程式執行:
從前面的執行機制描述中,可以獲知,程式執行到yield這行時,就不會繼續往下執行。而是返回一個包含當前函式所有引數的狀態的iterator物件。目的就是為了第二次被呼叫時,能夠訪問到函式所有的引數值都是第一次訪問時的值,而不是重新賦值。
程式第一次呼叫時:
程式第二次呼叫時:
從前面可知,第一次呼叫時,a,b=1,1,那麼,我們第二次呼叫時(其實就是呼叫第一次返回的iterator物件的next()方法),程式跳到yield語句處,
執行a,b = b, a+b語句,此時值變為:a,b = 1, (1+1) => a,b = 1, 2
程式繼續while迴圈,當然,再一次碰到了yield a 語句,也是像第一次那樣,儲存函式所有引數的狀態,返回一個包含這些引數狀態的iterator物件。
等待第三次的呼叫....
通過上面的分析,可以一次類推的展示了yield的詳細執行過程了!
通過使用生成器的語法,可以免去寫迭代器類的繁瑣程式碼,如,上面的例子使用迭代類來實現,程式碼如下:
yield其他例子展示:排列,組合
#生成全排列
相關文章
- python生成器Python
- Python 生成器Python
- 學習Source Generators之瞭解Source Generators的應用場景
- Python的生成器Python
- Python迷宮生成器Python
- 如何使用python生成器Python
- python 生成器&迭代器Python
- python跳坑---生成器Python
- 學習Source Generators之HelloWorld
- 學習Source Generators之IncrementalValueProviderREMIDE
- Python迭代器與生成器Python
- python生成器的原理探究Python
- Python3 生成器解析Python
- python進階(11)生成器Python
- python中生成器的使用Python
- ES6深度解析3:Generators
- .NET初探原始碼生成(Source Generators)原始碼
- 【譯】Async-Await≈Generators+PromisesAIPromise
- python四則運算生成器Python
- python如何快速建立生成器Python
- python三大神器===》生成器Python
- Python 高階特性(4)- 生成器Python
- Python語法—迭代器、生成器Python
- Python基礎(12):生成器 & reducePython
- 關於Python生成器,如何使用?Python
- 1.5.4 Python迭代器和生成器Python
- python列表生成式和生成器Python
- python 生成器 和生成器函式 以及各種推導式Python函式
- Python偽資料生成器Mimesis 使用Python
- python版網文圖片生成器Python
- python生成器函式的特點Python函式
- python如何建立遞增的生成器Python
- 解析python生成器函式的呼叫Python函式
- python中for語句讀取生成器Python
- Python 生成器不該這麼用Python
- Python迭代器&生成器&裝飾器Python
- python是如何實現生成器的Python
- Python生成器讀取大檔案Python
- 史上最全 Python 迭代器與生成器Python