1.闭包
# 外层参数来自与函数名一致的调用(实参),可同时传递闭包外的函数的引用和其它参数多个参数(形参)
# 内层参数来自外层函数调用对象的调用(实参),同时传递给闭包外的对应函数以及它的调用(形参)
# 通过外层传递的只初始化一次,通过内层传递的初始化次数与调用次数一致。就跟变量在while true外面和里面一样
def set_func(b):
def call_func():
print(b)
# f()
return call_func
def test():
print("t")
t = set_func("外层函数里面的变量内层直接使用,但是是在外层函数有参数的情况下,不然闭包就失去了存在的意义")
t()
def test2():
print("t2")
t = set_func("外层函数里面的变量内层直接使用")
t()
2.闭包与函数的区别
# 格式上:闭包是两层函数的嵌套
# 作用:闭包的外层一定要有参数,传递给内层使用(否则闭包就没存在的意义,还不如用一层函数),外层函数返回内层函数的引用。
# 闭包:简化函数,多次使用的抽取成外层函数的参数。
def sum1(a, b, rate):
print((a + b)*rate)
sum1(1000, 2000, 0.6)
sum1(2000, 3000, 0.6)
sum1(500, 200, 0.6)
def set_sum(rate):
def sum2(a, b):
print((a + b)*rate)
return sum2
sum2 = set_sum(0.6)
sum2(1000, 2000)
sum2(2000, 3000)
sum2(500, 200)
3.万能装饰器
# 万能装饰器,有不定长参数,有返回值
def set_fun(func):
def call_fun(*args, **kwargs):
check()
return func(*args, **kwargs)
return call_fun
@set_fun
def deco_func(*args, **kwargs):
print("deco_func")
print(args,kwargs)
return "万能装饰器"
def check():
print("权限认证")
print(deco_func("yeah", a=3))