所謂生成器是一個函數,它能夠生成一個值的序列,以便在迭代中使用。函數使用yield關鍵字能夠定義生成器對象。python
咱們調用該函數,就會發現其中的代碼不會開始執行函數
def countdown(n): print('從%d開始減小'%n) while(n>0): yield n n-=1 return countdown(10)
相應的,該函數返回一個生成器對象。接着該生成器對象就會在__next__被調用時執行函數,如:協程
c = countdown(10) # <generator object countdown at 0x102d0b780> print(c.__next__()) # 10 print(c.__next__()) # 9
調用next時,生成器函數開始執行語句,直至遇到yield語句爲止。yield語句在函數執行中止的地方生成一個結果,直至再次調用next。而後繼續執行yield以後的語句。對象
一般不會在生成器上直接調用next()方法,而是經過for語句,sum()或一些消耗序列的其餘操做使用生成器。blog
for n in countdown(5): print(n) print(sum(countdown(5)))
在函數內,yield語句還能夠做爲表達式使用,出如今賦值運算符的右邊,例如:generator
def receiver(): print('Ready to receive') while True: n = (yield) print(n) r = receiver() r.__next__() # Ready to receive r.send(1) # 1 r.send(2) # 2 r.send('Hello') # Hello
以這種方式使用yield語句的函數稱爲協程,向函數發送值時函數將執行。接收到值後,協程就會執行語句,直至遇到下一個yield語句。class
說明:一開始必須先執行next函數,這樣協程才能執行第一個yield表達式以前的語句object
協程通常會不斷地執行下去,除非被顯式關閉或本身退出,顯式關閉執行close語句便可。yield