生成器是带有yield的函数,可以通过迭代器next,或者send调用,每次调用时运行到yield处返回,并带回yield的结果,再下一次用过迭代器(next不可传值,send可传值)调用时从原来yield返回处继续向下执行。下面是截取的代码例子,冗余代码请忽略:
def fib(max): n, a, b = 0, 0, 1 while n < max: print(f'max:{max}') print('max:{}'.format(max)) x=yield max+1 print('x:',x) f=fib(22) y=f.send(None)#启动生成器时send只能传None,第一次运行到yield返回 print(f'y:{y}')#打印返回的结果23 r=next(f)#从yield返回出向下执行,打一次打印x为Node,第二次执行到yield返回 print(f'r:{r}')#打印第二次yeild返回结果23 f.send(10)#从第二次yield返回处继续执行,传入10,因此x打印结果为10,第三次运行到yeild处返回,返回结果被丢弃 f.close()#关闭生成器
yield只返回一个元素,yield from后加可迭代对象可以将对象中的元素一个个元素一个个的yield出来,注意yield from的生成器,不能通过send传值。