什麼是生成器
- 可以生成值的函數
- 當一個函數有了yield關鍵字就成了生成器
- 可以掛起執行並保持當前執行狀態的
def my_gen():
yield 'first'
yield 'second'
gen = my_gen()
print(next(gen))
print(next(gen))
基於生成器的協程
注:Python3前之前沒有原生協程,只有基於生成器的協程
注:Python3.5後開始引入 async/await 支持原生協程
- 生成器可以通過yield暫停執行和產出數據
- 同時支持send()向生成器發送數據和throw()向生成器拋出異常
協程的注意點:
- 協程需要send(None)或者next(gen)來預激才能啓動
- 在yield處協程會暫停執行
- 單獨的yield value會把產出值給調用方
- 通過send發送值,值會賦予給yield的的左邊變量
- 協程完成後會拋出StopIteration異常