python闭包的作用和来源
什么是闭包一个闭包例子:def print_msg():# print_msg 是外围函数msg = "zen of python"def printer():# printer 是嵌套函数print(msg)return printeranother = print_msg()# 输出 zen of pythonanother()注意,这里返回的是嵌套函数的名称,没有括号,也就是没有调用。后来给
·
- 什么是闭包
一个闭包例子:
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。
闭包,顾名思义,就是一个封闭的包裹,里面包裹着自由变量,就像在类里面定义的属性值一样,自由变量的可见范围随同包裹,哪里可以访问到这个包裹,哪里就可以访问到这个自由变量。想一想,神经网络中卷积操作的卷积核的大小,移动步长等这些基本属性,就是局部变量,可以直接和函数包装在一起,形成闭包,这样后面直接调用相应的函数名字就可,不需要每次都输入这些属性。
- 为什么使用闭包
闭包避免了使用全局变量,此外,闭包允许将函数与其所操作的某些数据(环境)关连起来。这一点与面向对象编程是非常类似的,在面对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联。
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
更多推荐
已为社区贡献1条内容
所有评论(0)