zoukankan      html  css  js  c++  java
  • python 闭包计算移动均值及nonlocal的使用

    class Averager1():
        '''计算移动平均值的类第一种写法'''
        def __init__(self):
            self.series = []
        
        def __call__(self,new_value):
            self.series.append(new_value)
            total = sum(self.series)
            return total/len(self.series)
    
    # avg1 = Averager1()
    # print(avg1(10))
    # print(avg1(11))
    # print(avg1(12))
    
    def make_averager():
        '''计算移动平均值的类第二种写法(闭包)'''
        series = [] #自由变量,历史数据保存在avg1.__closure__[0].cell_contents 中
        def averager(new_value):
            series.append(new_value)
            total = sum(series)
            return total/len(series)
        return averager
    
    avg1 = make_averager()
    print(avg1(10))
    print(avg1(11))
    print(avg1(12))
    def make_averager1():
        '''计算移动平均值的类第三种写法(nonlocal)不保存所有历史,提高效率'''
        count = 0
        total = 0
        def averager(new_value):
            nonlocal count,total #把变量标记为自由变量,不会因为不可变类型而变成局部变量而不保存在闭包中
            count +=1
            total += new_value
            return total/count
        return averager
    
    avg1 = make_averager1()
    print(avg1(10))
    print(avg1(11))
    print(avg1(12))
  • 相关阅读:
    判断元素的属性是否存在
    js 查找树节点 数组去重
    redis 基础知识
    jQuey知识点三 解析json数据
    jQuery知识点二 实现隔行变色
    mysql 基础操作一
    ruby 基础知识三 读写文件
    Active Record 数据迁移
    ruby 基础知识(二)
    rails 常用的知识点
  • 原文地址:https://www.cnblogs.com/Erick-L/p/8328595.html
Copyright © 2011-2022 走看看