美文网首页
闭包的实际应用

闭包的实际应用

作者: 超人不会飞_9664 | 来源:发表于2018-10-04 17:04 被阅读0次

闭包

闭包闭包顾名思义封闭的包裹,那它到底是个啥包裹呢
首先了解闭包前 我们先了解几个概念

作用域

作用域是程序运行时变量可被访问时的范围,定义在函数内部的是局部变量,局部变量的作用范围只能是函数内部范围内,它不能
在函数外部引用。
定义在模块最外层的变量是全局变量,它是全局范围内可见的,当然在函数里面也可以读取到全局变量的。例如:

num = 10 #全局变量
def foo():
   print(num)

而在函数外部则不可以访问局部变量。例如:

def foo():
    num = 10
print(num)
NameError: name 'num' is not defined

嵌套函数

函数不仅可以定义在模块的最外层,还可以定义在另外一个函数的内部,像这种定义在函数里面的函数称之为嵌套函数(nested function)例如:

def print_msg():
    #print_msg 是外围函数
    msg = 'liu of python'
    def printer():
        #printer是内嵌函数
        print(msg)
    printer()
print_msg()

输出为:

liu of python

可以看出外围函数的局部变量是嵌套函数的全局变量,所以内部函数里是可以访问到外围函数的局部变量的
那有没有一种即使不依附在外围函数下 也能访问到它的局部变量呢,答案就是闭包!

什么是闭包

我们来看一个例子:

def print_msg():
    #print_msg 是外围函数
    msg = 'liu of python'
    def printer():
        #printer是内嵌函数
        print(msg)
    return printer
another = print_msg()
another()

输出为:

liu of python

一般情况下,函数中的局部变量仅在函数的执行期间可用,一旦 print_msg() 执行过后,我们会认为 msg变量将不再可用。然而,在这里我们发现 print_msg 执行完之后,在调用 another 的时候 msg 变量的值正常输出了,这就是闭包的作用,闭包使得局部变量在函数外被访问成为可能。
看完这个例子,我们再来定义闭包,维基百科上的解释是:

在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。

为什么要使用闭包

闭包避免了使用全局变量,此外,闭包允许将函数与其所操作的某些数据(环境)关连起来。这一点与面向对象编程是非常类似的,在面对象编程中,对象允许我们将某些数据(对象的属性)与一个或者多个方法相关联。
一般来说,当对象中只有一个方法时,这时使用闭包是更好的选择。来看一个例子:

def adder(x):
    def wrapper(y):
        return x + y
    return wrapper

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

所有函数都有一个 closure属性,如果这个函数是一个闭包的话,那么它返回的是一个由 cell 对象 组成的元组对象。cell 对象的cell_contents 属性就是闭包中的自由变量。

>>> adder.__closure__
>>> adder5.__closure__
(<cell at 0x103075910: int object at 0x7fd251604518>,)
>>> adder5.__closure__[0].cell_contents
5

这解释了为什么局部变量脱离函数之后,还可以在函数之外被访问的原因的,因为它存储在了闭包的 cell_contents中了。

相关文章

  • 闭包的实际应用

    闭包 闭包闭包顾名思义封闭的包裹,那它到底是个啥包裹呢首先了解闭包前 我们先了解几个概念 作用域 作用域是程序运行...

  • 闭包(closure)

    ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...

  • (十一)函数<3>闭包

    抛砖引玉---"闭包" 用内嵌函数修改下: 抛物线实例 装饰器的本质,实际上也是闭包的一种应用.目前个人的理解,闭...

  • 内存泄漏

    闭包 在闭包中,内部函数引用外部函数变量,实际上是应用了外部函数的作用域(scope)对象 如果作用域对象所在函数...

  • Swift-进阶 :闭包(二)逃逸闭包 & 非逃逸闭包

    本文主要分析逃逸闭包 、非逃逸闭包、自动闭包 逃逸闭包 & 非逃逸闭包 逃逸闭包定义 当闭包作为一个实际参数传递给...

  • 深入贯彻闭包思想,全面理解JS闭包形成过程

    谈起闭包,它可是JavaScript两个核心技术之一(异步和闭包),在面试以及实际应用当中,我们都离不开它们,甚至...

  • 深入贯彻闭包思想,全面理解JS闭包形成过程

    谈起闭包,它可是JavaScript两个核心技术之一(异步和闭包),在面试以及实际应用当中,我们都离不开它们,甚至...

  • 闭包1(基础)

    (什么是闭包?闭包的作用?闭包的缺陷?) (闭包的几种可能的应用场景) (闭包与内存泄漏,有关闭包的面试题) 推荐...

  • 闭包与setTimeout

    闭包 闭包的作用: 闭包的本质是一个函数闭包可以访问函数内部变量闭包的存在会使内部变量保留在内存中闭包的应用: 模...

  • 闭包

    一、闭包技术详解 1.1 什么是闭包? 闭包实际上是一种函数,所以闭包技术也是函数技术的一种;闭包能做的事情函数几...

网友评论

      本文标题:闭包的实际应用

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