• 20191030-Python实现闭包


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

    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. 实现单例模式
  • 相关阅读:
    Webservice实践(七)CXF 与Spring结合+tomcat发布
    slave have equal MySQL Server UUIDs原因及解决
    VM+CentOS+hadoop2.7搭建hadoop完全分布式集群
    Ubuntu下MySQL主从同步配置
    解决Ubuntu14.04下vi编辑器不能使用方向键和退格键问题
    Ubuntu解压缩zip,tar,tar.gz,tar.bz2
    sersync+rsync原理及部署
    mysqldump备份成压缩包
    linux下如何实现mysql数据库每天自动备份定时备份
    ubuntu mysql 数据库备份以及恢复[命令行]
  • 原文地址:https://www.cnblogs.com/hyj691001/p/11768030.html
Copyright © 2020-2023  润新知