python闭包

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

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


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


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

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

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 转载自https://serholiu.com/python-closures了解闭包前,先了解一下变量作用域看个...
    第八共同体阅读 327评论 0 0
  • 一、python函数作用域LEGB python解释器查找变量的原则(顺序):L→E→G→BL:Local函数内部...
    风萧雨霖阅读 546评论 0 0
  • 作用域 在理解闭包前,先看一个函数: 可以看到func()函数内部的变量无法在函数外部使用 全局变量out_fun...
    XYZeroing阅读 1,043评论 0 10
  • 我在博客中曾经介绍过两篇关于函数的文章,第一篇是 关于 Python 函数是第一类对象,第二篇是关于 Lambda...
    liuzhijun阅读 1,617评论 2 27
  • 作用域 作用域是程序运行时变量可被访问的范围,定义在函数内的变量是局部变量,局部变量的作用范围只能是函数内部范围内...
    大川无敌阅读 387评论 0 0

友情链接更多精彩内容