(1) 闭包:两个函数的嵌套,外部函数返回内部函数的引用,外部函数一定有参数
(2) 嵌套函数:在其他函数中定义的函数称为嵌套函数,或局部函数**
- funA() 返回的是 funB 的引用。
funA()() 返回的是 880。
对于嵌套函数来说,外层函数的作用域是会通过某种形式给保存下来的,尽管这个函数已经调用完了,但是外层作用域里面的变量,它是会保存下来的,它并不会像局部作用域那样调用完就消失。
square = power(2) 这时 exp = 2,所以调用 square 总是计算平方; cube = power(3) 这时 exp = 3,所以调用 cube 总是计算立方。
这里运用了内层函数能够记住外层函数这个作用域的这个特性,并且使用nonlocal 这个语句,让它可以修改到外层函数作用域里面的这个变量,这样就可以实现带记忆功能的一个函数。2. 装饰器
装饰器是闭包加@xxx
装饰器的作用:在不改变原先的函数值跟调用的方式,添加额外的功能**
- 使用了装饰器
-
不使用装饰器
@time_master 等于 myfunc = time_master(myfunc) time_master(myfunc) 返回的是 call_func的地址
-
使用多个装饰器
结果为65 调用顺序:首先运行square,然后运行cube,最后运行add。
-
给装饰器传递参数
-
使用了装饰器
-
不使用装饰器
funA = logger(msg="A") 这时 logger(msg="A") 是 time_master 的引用。 funA = logger(msg="A")(funA) 返回的才是 call_func 的引用。
) 是 time_master 的引用。
funA = logger(msg=“A”)(funA) 返回的才是 call_func 的引用。