欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

20191030-Python实现闭包

程序员文章站 2023-02-04 15:12:49
打算在过年前每天总结一个知识点,所以把自己总结的知识点分享出来,中间参考了网络上很多大神的总结,但是发布时候因为时间太久可能没有找到原文链接,如果侵权请联系我删除 20191030:闭包 首先一个函数,如果函数名后紧跟一对括号,相当于现在我就要调用这个函数,如果不跟括号,相当于只是一个函数的名字,里 ......

打算在过年前每天总结一个知识点,所以把自己总结的知识点分享出来,中间参考了网络上很多大神的总结,但是发布时候因为时间太久可能没有找到原文链接,如果侵权请联系我删除

20191030:闭包

首先一个函数,如果函数名后紧跟一对括号,相当于现在我就要调用这个函数,如果不跟括号,相当于只是一个函数的名字,里面存了函数所在位置的引用。

闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

def myclosure(msg):
    closuremsg = "闭包msg"
    def inner():
        print(closuremsg)
        return closuremsg+msg
    # 返回内部函数的应用
    return inner
a = myclosure("闭包测试")
print(a())
b = myclosure("闭包是否能识别变量测试")
print(b())
输出结果:
闭包msg
闭包msg闭包测试
闭包msg
闭包msg闭包是否能识别变量测试

按理说myclosure函数调用结束后closuremsg参数的作用域结束,closuremsg内存空间释放

但是外函数结束的时候发现内部函数将会用到自己的临时变量,这两个临时变量就不会释放,会绑定给这个内部函数,所以外函数已经结束了,调用内函数的时候仍然能够使用外函数的临时变量。

闭包的临时变量修改-使用nonlocal关键字

def myclosure():
    closurvar = 10
    def inner(innervar):
        nonlocal closurvar
        closurvar +=innervar
        return  closurvar
    # 返回内部函数的应用
    return inner
c = myclosure()
print(c(1))
print(c(2))
输出结果:
11
13

可以看出每次调用inner的时候使用的closurvar变量其实是一个。

闭包的作用

  1. 实现装饰器
  2. 面向对象
  3. 实现单例模式