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))