所谓生成器是一个函数,它能够生成一个值的序列,以便在迭代中使用。函数使用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