函数闭包
什么是闭包?
内部函数对外部函数作用域里对象的引用(非全局变量),则称内部函数为闭包
一个闭包就是你调用了外部函数,外部函数返回内部函数,此时的内部函数就叫做闭包函数
闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例
闭包简单示例:
通过这个例子大家可以看到,在外部函数中,本应该在wai函数执行完死掉的变量a,由于此时有了 内部函数的引用,从而使得这个变量并不会死去,而是类似于继承一样,通过nei函数又存活了下来
接着让我们愉快的看下一个例子,继续理解闭包
三次闭包函数的执行结果,我们来看一下吧
分析一下,这里出现的结果
首先三次值都是在全局变量num的基础上做累加a的操作
说明在闭包函数对象res存活期间,a变量将会一直存活
最后我们以将一个可变数据对象作为闭包引用的变量为例
执行的结果
闭包思考:
闭包私有化了变量,实现了类似于面向对象中实例的功能
由于闭包引用了外部函数的局部变量,则外部函数中的局部变量没有及时释放,消耗内存
在python中,使用闭包的另一个场景就是装饰器,也叫语法糖@
实现闭包:
函数嵌套
内部函数对外部函数作用域里对象的引用
外部函数返回内部函数对象
装饰器函数
装饰器:在函数运行时增加功能且不影响这个函数原有内容
普通装饰器函数
语法:
@符号为装饰器函数语法,也常叫做语法糖
先来看一个简单的装饰器函数实现:
执行后的结果:
此时的foo函数在原有的基础上,额外多了装饰器函数中的定义的功能
被装饰函数foo在调用时,其实本质上是在进行wai(foo)()
wai(foo)()过程解析:
装饰器函数wai接收被装饰函数foo作为参数
返回return nei,闭包函数nei被返回
nei()函数调用
由于nei函数的返回值为return func(),所以在内函数调用结束时,被装饰函数也会被调用
被装饰函数在调用时,被调用的函数有三个:
wai() nei()以及被装饰函数func()
领取专属 10元无门槛券
私享最新 技术干货