装饰器来激活生成器
这是求移动平均值:
1 def active(func): # func=avg_num
2 def inner(*args,**kwargs):
3 g=func(*args,**kwargs) # avg_num()
4 next(g) # 相当于执行avg_num.next()
5 return g #返回一个生成器 <generator object avg_num at 0x00000000023A0D00>
6 return inner
7
8 @active # avg_num=active(avg_num)
9 def avg_num():
10 sum=0
11 count=0
12 avg=0
13 while True:
14 num=yield avg #程序会停在yield处
15 sum+=int(num)
16 count+=1
17 avg=sum/int(count)
18
19 g=avg_num() # avg_num= inner----> inner()
20 print(g) #返回一个生成器 <generator object avg_num at 0x00000000023A0D00>
21 # g.__next__() #激活生成器函数
22 while True:
23 n=input('请输入一个数:')
24 gre=g.send(n)
25 print(gre)
装饰器在这里相当于执行了下面的一句 g.__next__() 把生成器函数激活了
send的作用范围和next一样
第一个yield之前不能用send 得用next方法激活生成器
函数的最后一个yield不再接收新的值
当需要循环获取可迭代对象的每个元素是可以使用yield from
1 def show():
2 a='hello'
3 b='python'
4 yield from a
5 yield from b
6 g=show()
7 for i in g:
8 print(i)
#列表推导式与生成器表达式的例子:
1 #列表推导式
2 num_list=[i*i for i in range(10)]
3 print(num_list)
4
5 #生成器表达式
6 num_g=(j*j for j in range(10))
7 print(num_g)
8 for k in num_g:
9 print(k)
列表推导式 直接返回一串值在列表里
生成器表达式返回的是一个生成器地址,在内存里不占用什么空间,随时用随时生成 结果需要迭代才能看到
其他推导式
1 #字典推导式
2 dic_pro={'a':23,'b':56}
3 new_dic={dic_pro[k]:k for k in dic_pro}
4 print(new_dic)
5
6 dic_pro={'a':23,'b':56,'B':7}
7 new_dic={k.upper():dic_pro.get(k.lower(),0)+dic_pro.get(k.upper(),0)for k in dic_pro.keys()}
8 print(new_dic)
9
10 #集合推导式
11 tic={1,2,-2,3}
12 new_tic=[i**2 for i in [1,2,-2,3]]
13 print(new_tic)