累计行为 | Python
累计,就是不断计算增加的数据。累计行为如此普遍以至于在编程过程中往往我们使用到了而不自知。当循环体出现在程序中往往累计行为就开始了。最近我经常需要把 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:闭包也能用来实现累计行为