累计行为 | Python

clo-cry / 2025-01-20 / 原文

累计,就是不断计算增加的数据。累计行为如此普遍以至于在编程过程中往往我们使用到了而不自知。当循环体出现在程序中往往累计行为就开始了。最近我经常需要把 Python 作为一个计算器来验算一些数学题,由此总结了些 Python 中累计行为的实现方法

1. reduce

这是 functools 标准库里的函数,作用不言而喻——累计运算一组数据。虽然编程出场率可能不如 map 但是需要它的时候是真耐用,完全是官方给的挂。

评分: ⭐⭐⭐

2. 类属性

类可以很方便封装一些变量防止名称空间被污染,不过对于类来说只是做这种简单的事有点大财小用了。下面是一个不断计算新平均值的一段代码:

class Averager:
    def __init__(self):
        self.series = []

    def __call__(self, new_value: int|float = None):
        if new_value is not None:
            self.series.append(new_value)
        else:
            pass
        total = sum(self.series)
        return total/len(self.series)

avg = Averager()
for i in range(11):
    avg(i)
print(avg())

这个例子来自 Fluent Python 。其中用到了特殊方法 __call__,这个方法在函数调用的时候生效,这根本就是把类当函数用了啊(#`O′),实用性感觉可以忽略不记。

评分: ⭐⭐

3. 上面例子的函数版本

上面的例子完全可以用函数改造。

def get_averager():
    series = []

    def averager(value: int|float = None):
        if value is not None:
            series.append(value)
        else:
            pass
        total = sum(series)
        return total / len(series)

    return averager

评分: ⭐⭐⭐


TIPs:闭包也能用来实现累计行为