美文网首页
对python中闭包概念的理解

对python中闭包概念的理解

作者: aier_wiki | 来源:发表于2019-01-25 23:41 被阅读0次

首先通过一例子直观理解一下闭包是什么

实现一个函数avg(),每次调用该函数,传入一个数值,返回历史调用中,所有入参的平均值。
>>> avg(1)
1.0
>>> avg(2)
1.5
>>> avg(3)
2.0

方式一:

class Averager():
    def __init__(self):
        self.series = []
    def __call__(self, new_value):
        self.series.append(new_value)
        total = sum(self.series)
        return total / len(self.series)
avg = Agerager()
avg(1)
avg(2)
avg(3)

这种方式是传统的面向对象的实现方式,python还提供一种闭包的机制可以实现上述功能。
方式二:

def make_averager():
    series = []
    def averager(new_value):
        series.append(new_value)
        total = sum(series)
        return total / len(series)
    return averager

avg = make_averager()
avg(1)
avg(2)
avg(3)

第二种方式,是定义了一个高阶函数,所谓高阶函数就是入参或者返回值为函数的函数。make_averager()的返回值是一个函数,并且该函数是在自己的函数体内定义的。而且还有一点需要注意,就是内部函数averager()中使用了外部函数的局部变量series。被当做返回值的averager就是所谓的闭包。
综上,闭包出现的条件如下:

  • 出现函数的嵌套定义。
  • 嵌套函数引用了外层函数第一的变量。
  • 外层函数返回嵌套函数。

有一点需要注意,为什么make_averager()已经执行完返回了,但averager还能使用make_averager中定义的局部变量呢?
在python中有一个重要的思想:函数是第一对象。所以函数可以像一般的对象一样,可以含有属性。闭包作为一种函数对象,就拥有自己的属性。avg的属性closure中保存着avg可以使用的外层函数的局部变量。这些变量有一个学术上的名字叫自由变量
可以通过如下方式查看自由变量的值:

>>> avg.__closure__[0].cell_contents
[1, 2, 3]

相关文章

  • 对python中闭包概念的理解

    首先通过一例子直观理解一下闭包是什么 实现一个函数avg(),每次调用该函数,传入一个数值,返回历史调用中,所有入...

  • 理解Python闭包概念,Python作用域详述!

    闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛。理解python中的闭包一方面是能够正确的使...

  • 彻底理解JS闭包

    闭包并不是JS所独有的,在计算机科学中其是一个普遍的概念,在Python中也有闭包的概念,但闭包在Python应用...

  • python装饰器简单使用

    '''理解装饰前先理解python闭包的概念:https://www.cnblogs.com/s-1314-521...

  • python函数之闭包

    目录 python函数之闭包什么是闭包python中的namespace闭包的条件闭包的优点 python函数之闭...

  • python之理解闭包和装饰器

    python之理解闭包和装饰器 1、闭包函数 1.1 python中函数都是对象 结果: 上面定义一个shut函数...

  • Python中的闭包

    php对闭包的定义是匿名函数,我之前对python闭包的理解是:外部函数以内部函数作为返回值,称之为闭包!!!(错...

  • Python装饰器与闭包!

    闭包是Python装饰器的基础。要理解闭包,先要了解Python中的变量作用域规则。 变量作用域规则 首先,在函数...

  • 理解Python中的闭包

    Python基础 在Python中,函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数。...

  • 谈谈C++中闭包的实现

    python的闭包 闭包这个概念一直有所耳闻,在以前看《Java编程思想》时第一次真正接触,当时的理解就是类似C+...

网友评论

      本文标题:对python中闭包概念的理解

      本文链接:https://www.haomeiwen.com/subject/wahbjqtx.html