第十六天,生成器
生成器
1.定义
1.生成器就是把数据放在内存,需要的时候从里面取,是可以迭代的
2.生成器里面没值,用值的时候用循环和next取出
s1=(x*2 for x in range (10)) print(s1) #<generator object <genexpr> at 0x00000000011286D0> generator object生成器对象,里面没值,用值的时候用循环和next取出
2.创建方法
生成器一共有两种方式创建
1.x*2 for x in range (10))
s=(x*2 for x in range (100))
2.yield创建
def foo(): print("ok1") yield 1 #只要有yield就是生成器对象 print("ok2") yield 2 return None g=foo() # a=next(g) #得到的时返回值yield1 # b=next(g) #得到的时返回值yield2 # print(a,b) for i in foo(): #for循环后面接的是可迭代对象 print(i) # ok1 # 1 再次进去将1返回赋值给i # ok2 # 2 再次进去将2返回赋值给i
3.遍历
3.1生成器就是一个可迭代对象,可以直接遍历生成器
s=(x*2 for x in range (10)) #等价于print(next(s)) for i in s: #s生成器就是一个可迭代对象,可以直接遍历生成器 print(i)#等价于 print(s.__next__()) ,循环内部做了一个next()
#运行结果:
0
2
4
6
8
10
12
14
16
18
什么是可迭代的对象
#什么是可迭代对象 #1.列表 l=[1,2,3] l.__iter__() #有iter方法 #2.字典
实例: 斐波那契额函数

1 #斐波拉契 2 def fib(max): 3 n,befor,after=0,0,1 4 while (n<max): 5 #print(after) 6 yield (after) #将after做成生成器 7 befor,after=after,befor+after 8 n+=1 9 g=fib(12) 10 print(g) 11 for i in g: 12 print(i)
3.2 send方法 b.send(“xx”) b为生成器对象 里面可以传参数。 注意一次send前 如果没有next,只能传一个send(Nnoe)
def bar(): print("ok1" ) count=yield 1 print(count) yield 2 b=bar() b.send(None) #等同于next(b), 注意一次send前 如果没有next,只能传一个send(Nnoe) ret=b.send("eee") print(ret) #运行结果 ok1 eee 2
伪并发实例

1 import time 2 def consumer(name): 3 print("%s 准备吃包子啦!" %name) 4 while True: 5 baozi = yield 6 print("包子[%s]来了,被[%s]吃了!" %(baozi,name)) 7 def producer(name): 8 c = consumer('A') 9 c2 = consumer('B') 10 c.__next__() 11 c2.__next__() 12 print("老子开始准备做包子啦!") 13 for i in range(10): 14 time.sleep(1) 15 print("做了2个包子!") 16 c.send(i) 17 c2.send(i) 18 producer("alex") 19 运行结果: 20 21 A 准备吃包子啦! 22 B 准备吃包子啦! 23 老子开始准备做包子啦! 24 做了2个包子! 25 包子[0]来了,被[A]吃了! 26 包子[0]来了,被[B]吃了! 27 做了2个包子! 28 包子[1]来了,被[A]吃了! 29 包子[1]来了,被[B]吃了! 30 做了2个包子! 31 包子[2]来了,被[A]吃了! 32 包子[2]来了,被[B]吃了! 33 做了2个包子! 34 包子[3]来了,被[A]吃了! 35 包子[3]来了,被[B]吃了! 36 做了2个包子! 37 包子[4]来了,被[A]吃了! 38 包子[4]来了,被[B]吃了! 39 做了2个包子! 40 包子[5]来了,被[A]吃了! 41 包子[5]来了,被[B]吃了! 42 做了2个包子! 43 包子[6]来了,被[A]吃了! 44 包子[6]来了,被[B]吃了! 45 做了2个包子! 46 包子[7]来了,被[A]吃了! 47 包子[7]来了,被[B]吃了! 48 做了2个包子! 49 包子[8]来了,被[A]吃了! 50 包子[8]来了,被[B]吃了! 51 做了2个包子! 52 包子[9]来了,被[A]吃了! 53 包子[9]来了,被[B]吃了!