Python中的yield


來自: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(),這個生成器就會生成一個值,是處理無窮序列的常見方法。










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章