接下來是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,如此下去.