- 定义
通过列表生成式,我们可以直接创建一个列表。但是,收到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在python中,这种一遍循环一遍计算的机制,成为生成器:generator#列表,占用内存a = [1,2,3,4,5,6,7,8,9,10]#简单的生成器b = [i*2 for i in range(10)]print(b)
c = (i*2 for i in range(10))print(c)
结果:<generator object <genexpr> at 0x0000000001E6FE60>
- 特性:
- 只有在调用的时候才会生成相应的数据
- 只记录当前位置
- 只有一个_next_()方法
def fib(max): n,a,b = 0,0,1 while n < max: #print(b) yield b #yield a,b = b,a+b ''' a,b = b,a+b相当于 t = (a,a+b) a = t[0] b = t[1] ''' n = n+1 return "feibo"#在生成器里面,这个是错误后显示的内容gen = fib(10)print(gen)print(gen.__next__())print(gen.__next__())print("=========================")print(gen.__next__())print(gen.__next__())print(gen.__next__())print(gen.__next__())print(gen.__next__())print(gen.__next__())
生成器并行,初步生产模式
import timedef consumer(name): print("%s要去吃包子了"%name) while True: baozi = yield print("%s来了,被【%s】吃掉了"%(baozi,name))def producer(name): c = consumer("A")#将A传入consumer里面,将之变成了一个生成器 c1 = consumer("B")#将B传入consumer里面,将之变成了一个生成器 c.__next__()#调用生成器,获取信息,到到 baozi c1.__next__()#调用生成器,获取信息,到到 baozi print("老子要做包子了") for i in range(10): time.sleep(1) print("做了两个包子") c.send(i)#将对应i的数据传入到之前跳出yield的baozi里面 c1.send(i)#将对应i的数据传入到之前跳出yield的baozi里面producer("alex")