一、生成器(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

 

版权声明:本文为haichong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/haichong/p/8570316.html