python--生成器
一、生成器(generator)
1、概念
生成器是一种特殊的迭代器,以一种懒加载的模式生成值。
2、创建方式
(x**2 for x in range(10))
1 s=(x*2 for x in range(5)) 2 3 4 print(next(s)) 5 print(next(s)) 6 print(next(s)) 7 print(next(s)) 8 print(next(s)) 9 #这里多加一个print(next(s))会报错 10 11 for i in s: 12 print(i) 13 #for循环会处理stopIteration 14 15 16 #两种输出方式 17 #print(s.__next__())#不建议使用 18 #next(s)#等价于s.__next__()建议使用
通过yield
1 def foo(): 2 print('ok') 3 yield 1 4 print('ok2') 5 yield 2 6 7 g=foo()#此时的g是一个生成器对象 8 9 next(g)#进入后执行print('ok'),返回值为1(这里的next(g)==1) 10 next(g)#进入后执行print('ok2'),返回值为2(这里的next(g)==2) 11 12 for i in g: 13 print(i)#这里的i等价于next(g)
生成器函数跟普通函数只有一点不一样,就是把 return 换成yield,其中yield是一个语法糖,内部实现了迭代器协议,同时保持状态可以挂起。
3、斐波那契数列
1 def fid(max): 2 n, a, b = 0, 0, 1 3 while n < max: 4 print(b) 5 a, b = b, a+b 6 n = n + 1 7 8 fid(10) 9 10 def fid(max): 11 n, a, b = 0, 0, 1 12 while n < max: 13 yield b 14 a, b = b, a+b 15 n = n + 1 16 17 for i in fid(10): 18 print(i)
生成器与斐波那契数列相似,都是通过计算返回下一个数值
4、send函数
1 def bar(): 2 print('ok') 3 count = yield 1 4 print(count) 5 yield 2 6 7 b = bar() 8 b.send(None) 9 b.send('rap god') 10 11 # 断点调试 12 # 1、内存有块内容 13 # 2、创建生成器 14 # 3、第一次进入生成器,没有传入任何参数,相当于next(b),到了yield 1返回 15 # 4、第二次进入传参,赋值给count,返回值为2