python闭包

假如有个名为avg的函数,它的作用是计算不断增加的系列值的均值;例如,整个历史中某个商品的平均收盘价。每天都会增加新价格,因此平均值要考虑目前为止所有的价格。

我们可以通过类来使用,举例如下:


在上述类中,我们定义了__call__方法,来声明类为可调用函数,每次调用时,将变量存储在self.series列表中。同样上述例子也可以采用函数的嵌套来完成,实现方法如下:


python闭包_第1张图片

注意,这两个示例有共通之处:调用Average()或make_average()得到一个可调用的avg,它会更新历史值,然后计算当前均值。这两个例子中的难点在于如何存储历史值。Average类的实例avg在哪里存储历史值很明显:self.series实例属性。但是第二个示例中的avg函数在哪里寻找series呢?

注意,series是make_averager函数的局部变量,因为那个函数的定义体中初始化了series:series=[]。可是,调用avg(10)时,make_averager函数已经返回了,而它的本地作用域也一去不复返了。

在averager函数中,series是自由变量。这是一个技术术语,指未在本地作用域中绑定的变量。

综上,闭包是一种函数,它会保留定义函数时存在的自由变量的绑定,这样调用函数时,虽然定义作用域不可用了,但是仍然能使用那些绑定。

注意,只有嵌套在其他函数中的函数才可能需要处理不在全局作用域中的外部变量。

你可能感兴趣的:(python闭包)