首页 > 其他 > 详细

为什么有的地方使用闭包?

时间:2020-05-06 19:38:40      阅读:46      评论:0      收藏:0      [点我收藏+]

技术分享图片

问题来源:交流群里,一个人提出问题,我也不太能说的明白,借着这个机会学习一下闭包。

问题描述:为什么要采用闭包的方式,而不是像图中所示一样传入两个参数。只是为了让代码更优雅吗?

闭包的理解:

? 闭包就是函数中的函数,里面的函数可以访问外部的函数的变量,外边的变量是这个内部函数的一部分。

定义闭包函数

? 嵌套函数中的非局部变量

在另一个函数内部定义的函数称为嵌套函数。嵌套函数可以访问封闭范围的变量。

在Python中,默认情况下,这些非本地变量是只读的,我们必须将它们明确声明为非本地变量(使用nonlocal关键字)才能进行修改。

def func_a(msg):
    def func_b():
        print(msg)
    func_b()
func_a(‘a‘)

# 输出 
# a

由以上代码可以看到嵌套函数 func_b 能够访问封闭函数的的非局部变量 msg。

如果函数 func_a()的最后一行返回 func_b() 函数而不是调用函数。

def func_a(msg):
    def func_b():
        print(msg)
    return func_b
c = func_a(‘a‘)
print(c)
c()
# 输出
# <function func_a.<locals>.func_b at 0x000001DB02FEDB70>
# a

? func_a() 调用字符串 a , 返回之后绑定到另一个函数名,调用另一个函数时,虽然我们已经停止执行 func_a() ,但是仍旧记得该消息。

? 即使 变量超出了范围,或者函数本身已经从当前名称空间中删除,也将记住封闭范围中的值

python 创建闭包必须满足的条件

  • 必须有一个嵌套函数

  • 嵌套函数必须引用在封闭函数中定义的值

  • 封闭函数必须返回嵌套函数

什么时候使用闭包

? 闭包可以避免使用全局值,并提供某种形式的数据隐藏,它还可以为该问题提供面向对象的解决方案。

? 当在一个类中实现的方法很少(大多数情况下是一个方法)时,闭包可以提供另一种更优雅的解决方案。但是,当属性和方法的数量变大时,最好实现一个类。

? python中装饰器也使用了大量闭包。

对于提出的问题--->为什么不用

最后,最好指出可以找到封闭在封闭函数中的值。

所有函数对象都有一个__closure__属性,如果它是一个封闭函数,则该属性返回单元格对象的元组。参考上面的示例,我们知道times3并且times5是闭包函数。

>>> make_multiplier_of.__closure__
>>> times3.__closure__
(<cell at 0x0000000002D155B8: int object at 0x000000001E39B6E0>,)

单元格对象具有存储关闭值的属性cell_contents。

>>> times3.__closure__[0].cell_contents
3
>>> times5.__closure__[0].cell_contents
5

为什么有的地方使用闭包?

原文:https://www.cnblogs.com/clpy/p/12837667.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!