嵌套: 在函数的内部定义函数
闭包: 符合开放封闭原则:在不修改源代码与调用方式的情况下为函数添加新功能
知识兔# global 将局部变量变成全局变量num = 100def fn1(): global num num = 600 return numprint(fn1()) # 600# nonlocal 将局部变量变成嵌套变量def outer(): num = 888 def inner(): nonlocal num num = 666 print(num) # 666 inner() print(num) # 666outer()# 装饰器# 在不改变源代码的形势下 添加新功能def outer(func): def inner(*args,**kwargs): # pass # 新功能 res = func (*args,**kwargs) # 解压带给原功能 pass # 新功能 return res return inner# 使用装饰器(outer),得到新功能(inner)@outerdef fn(): passres=fn()print(res)def foo(fn): # 定义一个嵌套函数 def bar(a): fn(a * (a - 1)) print("*" * 15,) return fn(a * (a - 1)) return bar'''下面装饰效果相当于:foo(my_test),my_test将会替换(装饰)成该语句的返回值;由于foo()函数返回bar函数,因此my_test就是bar同时,my_test 的参数 a 对应 bar 函数的参数 a'''@foodef my_test(a): print("==my_test函数==", a)# 打印my_test函数,将看到实际上是bar函数print(my_test,1111111)# 下面代码看上去是调用my_test(),其实是调用bar()函数my_test(10)