• 装饰器来激活生成器


    这是求移动平均值: 
    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)
  • 相关阅读:
    快速排序算法
    excel取值
    5.管理控制文件和日志文件
    贝叶斯决策与参数估计小结
    Kernel Methods (5) Kernel PCA
    Kernel Methods (4) Kernel SVM
    Kernel Methods (3) Kernel Linear Regression
    Kernel Methods (2) Kernel function
    Kernel Methods (1) 从简单的例子开始
    PCA算法是怎么跟协方差矩阵/特征值/特征向量勾搭起来的?
  • 原文地址:https://www.cnblogs.com/wen-kang/p/9314031.html
Copyright © 2020-2023  润新知