飄逸的python - yield簡明教程

只要函數含有yield語句,它就返回一個生成器.所以我們與其把其看成函數定義,不如看作是生成器定義.函數用return返回,而生成器用yield返回.
接下來是yield的行爲.

比如

def html():
    yield 'header'
    for i in range(5):
        yield i
    yield 'footer'

h = html()#此時h變量就是一個生成器.
for x in h:#遍歷生成器
    print x
怎麼理解這個函數呢?
使用"yield消除技術",用一個結果變量來收集yield的東西並返回.
於是轉換成

def html():
    ret = []
    ret.append('header')
    for i in range(5):
        ret.append(i)
    ret.append('footer')
    return ret
可以看到,yield語句沒了,所有東西都在ret這個序列.

生成器的強大魔法在於它是延遲執行的,在需要的時候它纔去執行代碼,它"記住"了yield的執行位置,獲取下一個結果的時候從上一次yield的位置繼續往下走.
所以生成器相對於list,它每個時刻只保存一個當前結果,節省了內存,缺點是無法用下標索引,遍歷一次就沒了.另一個好處是可以生成無窮序列,如cycle.

需要注意的是,當我們調用函數的時候,它並不開始執行函數體代碼,只是返回一個生成器.
比如
def A():
    print 'hehe'
    yield 1
    yield 2
當我們A()時,並不會print 'hehe',而只有當我們遍歷的時候,它纔開始執行,從函數體第一行代碼直到第一個yield,而後繼續往下執行代碼到下一個yield,如此下去.


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