zoukankan      html  css  js  c++  java
  • 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. 实现单例模式
  • 相关阅读:
    jquery 使用on方法给元素绑定事件
    bootstrap 学习笔记(部分)
    ajax 调用 webService
    ASP.NET 上传文件
    SQL 表 数据备份
    在控制台程序中,添加config文件
    webConfig的使用
    C# 下载文件的心得
    JS将页面中表格,导出到Excel中(IE中)
    Yahoo 军规(部分)
  • 原文地址:https://www.cnblogs.com/hyj691001/p/11768030.html
Copyright © 2011-2022 走看看