程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> python yield和generators(生成器)

python yield和generators(生成器)

編輯:Python

在python中,yield就是這樣的一個生成器。

yield 生成器的運行機制
當你問生成器要一個數時,生成器會執行,直至出現 yield 語句,生成器把 yield 的參數給你,之後生成器就不會往下繼續運行。 當你問他要下一個數時,他會從上次的狀態。開始運行,直至出現yield語句,把參數給你,之後停下。如此反復 直至退出函數。(以上關於yield的描述,在後面列舉一個簡單的例子來解釋這段話)。

yield的使用
在python中,當你定義一個函數,使用了yield關鍵字時,這個函數就是一個生成器,它的執行會和其他普通的函數有很多不同,函數返回的是一個對象,而不是你平常 所用return語句那樣,能得到結果值。如果想取得值,那得調用next()函數,如:

    c = h() #h()包含了yield關鍵字 
    #返回值 
   print  c.next() 

比如有的for in 操作的話,會自動的調用生成器的.next()方法。

每當調用一次迭代器的next函數,生成器函數運行到yield之處,返回yield後面的值且在這個地方暫停,所有的狀態都會被保持住,直到下次next函數被調用,或者碰到異常循環退出。

下面,來看看以下的例子代碼吧,是用來說明yield運行機制的。

#encoding=utf-8

def fib(max):
   a, b = 1, 1
   while a < max:
       yield a #generators return an iterator that returns a stream of values.
       a, b = b, a+b

for n in fib(15):
   print n  

從前面的運行機制描述中,可以獲知,程序運行到yield這行時,就不會繼續往下執行。而是返回一個包含當前函數所有參數的狀態的iterator對象。目的就是為了第二次被調用時,能夠訪問到函數所有的參數值都是第一次訪問時的值,而不是重新賦值。

程序第一次調用時:

yield a #這時a,b值分別為1,1,當然,程序也在執行到這停止並且返回。

程序第二次調用時: 從前面可知,第一次調用時,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的詳細運行過程了!

*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved