1. 什么是闭包
    一个闭包例子:
def print_msg():
    # print_msg 是外围函数
    msg = "zen of python"
    def printer():
        # printer 是嵌套函数
        print(msg)
    return printer

another = print_msg()
# 输出 zen of python
another()

注意,这里返回的是嵌套函数的名称,没有括号,也就是没有调用。后来给了another,最后一行加了括号,才会调用anoter,进入嵌套函数,打印输出 zen of python。

闭包,顾名思义,就是一个封闭的包裹,里面包裹着自由变量,就像在类里面定义的属性值一样,自由变量的可见范围随同包裹,哪里可以访问到这个包裹,哪里就可以访问到这个自由变量。想一想,神经网络中卷积操作的卷积核的大小,移动步长等这些基本属性,就是局部变量,可以直接和函数包装在一起,形成闭包,这样后面直接调用相应的函数名字就可,不需要每次都输入这些属性。

  1. 为什么使用闭包
    闭包避免了使用全局变量,此外,闭包允许将函数与其所操作的某些数据(环境)关连起来。这一点与面向对象编程是非常类似的,在面对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联。
def adder(x):
    def wrapper(y):
        return x + y
    return wrapper

adder5 = adder(5)
# 输出 15
adder5(10)
# 输出 11
adder5(6)

这比用类来实现更优雅,此外装饰器也是基于闭包的一中应用场景。

所有函数都有一个 __closure__属性,如果这个函数是一个闭包的话,那么它返回的是一个由 cell 对象 组成的元组对象。cell 对象的cell_contents 属性就是闭包中的自由变量。
在这里插入图片描述

参考博文:

https://foofish.net/python-closure.html

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐