20191030-Python实现闭包

阿里云2000元红包!本站用户参与享受九折优惠!

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

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. 实现单例模式

https://www.cnblogs.com/hyj691001/p/11768030.html

Python量化投资网携手4326手游为资深游戏玩家推荐:《《第五人格》:【更新公告】中秋活动开启,月神再临庄园;园丁礼包上架,荧荧幽光寄思

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
NumPy
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论