yield語句隻用于定義generator函數,調用generator函數會傳回一個geneator對象g; 可以通過調用g的方法控制g的運作
generator内部的變量及調用棧等都可以在generator的運作/挂起過程中得到儲存,這個特性跟corountine很像,實際上像Tornado等也是利用yield,異步IO等實作的協程。
def generator():
try:
m = yield
print('m1', m)
m = yield m
print('m2', m)
m = yield m
print('m3', m)
except TypeError:
print('In generator type exception caught.')
yield
try:
yield
yield
finally:
print('clean up')
if __name__ == '__main__':
gtr = generator() # 傳回一個generator
print(next(gtr)) # 運作至第一個yield語句結束并傳回,gtr的局部變量,調用棧得到保留
print('before send 991')
print(gtr.send())
# print(next(gtr))
print(gtr.throw(TypeError, "generator throw 1."))
print(next(gtr))
gtr.close()
輸出:
# yield 第一個值0, 對應 yield 0
before send # 表明send還沒運作且馬上運作
m1 # 已經執行了send, 執行了m = (yield 0)的結果,(yield 0)的結果為send傳遞進去的參數991
In generator type exception caught. # throw可以被caught
clean up # close 會導緻finally部分的運作。
after close