函数中,只要出现yield就是一个生成器:
1 def func(a,b): 2 3 if a<b: #有yield的函数就会形成一个生成器,不是函数!!! 4 yield 5 #yield可以返回后面的值,但是每碰执行一个__next__才会返回 5 else: 6 return "没了" #有yield的函数,即便有return也不会执行.要不走yield或者报错,StopIteration 7 print(func(1,3)) 8 print(func(3,1)) 9 print(func(1,3).__next__())
结果对照:
1 <generator object func at 0x00000149171421B0> 2 <generator object func at 0x00000149171421B0> 3 5
1 def func(a,b): 2 3 if a<b: #有yield的函数就会形成一个生成器,不是函数!!! 4 yield 5 #yield可以返回后面的值,但是每碰执行一个__next__才会返回 5 else: 6 return "没了" #有yield的函数,即便有return也不会执行.要不走yield或者报错,StopIteration 7 print(func(1,3)) 8 print(func(3,1)) 9 print(func(3,1).__next__())
结果对照:
1 <generator object func at 0x00000233FCD221B0> 2 print(func(3,1).__next__()) 3 StopIteration: 没了
__next__与send()的区别:
1 def func(): 2 print(44) 3 l = yield 89 #将898值返回出去,但不继续执行 4 print(l) 5 yield 99 6 s = func() 7 print(s.send(None)) #send可以做第一次__next__,但是参数必须是None否则会报错 8 print(s.__next__())
结果对照:
1 44 2 89 3 None 4 99
总结:
#程序执行yield时候,先将右侧返回,但不向下继续执行..可以理解return是返回后结束,yield是返回后暂停,yield后面没有值也默认返回None
#__next__和send(None)是一样的,__next__默认是send()参数是传None
1 def func(): 2 for i in range(4): 3 yield i 4 g = func() 5 print(g.__next__()) #从生成器g中取出一个值 6 print(list(func())) #这步重新生成一个生成器 7 for i in g: 8 print(i) # 9 print(list(g)) #再次看一下生成器g
结果对照:
1 0 2 [0, 1, 2, 3] 3 1 4 2 5 3 6 [] #验证每个生成器只能被取一次
生成器具有,惰性机制,不使用就不会干活..并且每个生成器只能一个一个取,只取一次