來自:http://blog.csdn.net/u012671171/article/details/42169843
def fib(max):
a, b = 1, 1
while a < max:
yield a
a, b = b, a+b
for n in fib(15):
print n
m = fib(13)
print m
print m.next()
print m.next()
print m.next()
以上是一段關於斐波那契數列的程序。
fib()函數因爲含有yield,被系統默認爲是一個生成器。
for語句調用了fib(15)。當max=15時,進入fib()生成器,執行到yield a, 返回a值以及整個生成器暫停的狀態,將a值賦給n, 打印出來;因爲是for語句循環,所以又回到fib(15)語句,由於是生成器,因此從上次截斷的位置開始執行,b值賦給a, a+b值賦給b,又因爲是while語句,則繼續while循環,yield a值,循環暫停跳出返回a值及生成器狀態,把a值賦給n, 打印n。如此往復,一直循環到15結束。
m被賦了fib(13)這個生成器,每一次執行m.next()函數就會打印下一個值。
從上面的分析過程,我們看一下運行結果:
注意:
1. 每個生成器只能使用一次。比如上個例子中的m生成器,一旦打印完m的6個值,就沒有辦法再打印m的值了,因爲已經吐完了。
2. yield一般都在def生成器定義中搭配一些循環語句使用,比如for或者while,以防止運行到生成器末尾跳出生成器函數,就不能再yield了。有時候,爲了保證生成器函數永遠也不會執行到函數末尾,會用while True: 語句,這樣就會保證只要使用next(),這個生成器就會生成一個值,是處理無窮序列的常見方法。