生成器
生成器是python特有的一個語法萨赁,包含yield 關鍵字的函數(shù),當他被調(diào)用的時候兆龙,函數(shù)體中的代碼不會被執(zhí)行,而是返回一個迭代器敲董。每次請求一個值紫皇,就會執(zhí)行生成器中的代碼,直到遇到一個yield或return語句腋寨。yield意味著生成一個值聪铺。return語句意味著生成器停止執(zhí)行。
下面是一個簡單的生成器
nested = [[1,2],[3,4],[5]]
def flatten(nested):
for sublist in nested:
for element in sublist:
yield element
上述函數(shù)使用了雙重循環(huán)萄窜,加上yield進行構造生成器的設置铃剔,yield 函數(shù)與return最大的區(qū)別在于,return語句返回一個值查刻,而yield則是產(chǎn)生一個值键兜,但是凍結(jié)他,函數(shù)停在那點等待被激活穗泵。函數(shù)被激活后從那一點開始執(zhí)行普气。
下面是執(zhí)行生成器來迭代所有的值
for num in flatten(nested):
print num
1
2
3
4
5
list(flatten(nested))
[1,2,3,4,5]
遞歸生成器
def flatten(nested):
try :
for sublist in nested:
for element in flatten(sublist):
yield element
excepet TypeError:
yield nested
其實生成器并非什么特殊的的魔法,他通過其他基本語句也能打到相同的目的佃延,對于大多數(shù)生成器而言
yield some_expression
都·等價與
result.append(some_expression)