第十六天,生成器

 

生成器

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)
View Code

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]吃了!
View Code

 

posted @ 2022-01-28 22:51  夜神月&l  阅读(21)  评论(0)    收藏  举报