將之前學(xué)習(xí)Python的筆記整理記錄下來胯甩。
閉包
概念:
一種組織代碼的結(jié)構(gòu),減少了參數(shù)傳遞,提高了代碼的可重復(fù)使用性
如果在一個內(nèi)嵌函數(shù)里,對在外部函數(shù)內(nèi)的變量進(jìn)行引用,那么內(nèi)嵌函數(shù)就被認(rèn)為閉包铸磅。
缺點(diǎn):
由于閉包引用了外部函數(shù)的局部變量,則外部函數(shù)的局部變量沒有及時釋放杭朱,消耗內(nèi)存阅仔。
前提:
1.必須有一個內(nèi)嵌函數(shù)
2.內(nèi)嵌函數(shù)必須引用外部函數(shù)的變量
3.外部函數(shù)的返回值必須是內(nèi)部函數(shù)對象
舉例:
def func(a, b):
def func_in(x):
return a * x + b
# 返回內(nèi)部函數(shù)
return func_in
if __name__ == '__main__':
ts = func(1, 1)
# 傳遞參數(shù)
print(ts(2))
裝飾器
概念:
1.裝飾器其實(shí)是用閉包來實(shí)現(xiàn)的。
2.本質(zhì)上是一個python函數(shù)弧械,它可以讓其他函數(shù)在不需要做任何代碼變動的前提下增加額外功能八酒,裝飾器的返回值也是一個函數(shù)對象。
3.裝飾器不能對被裝飾的函數(shù)內(nèi)部進(jìn)行操作 只能在函數(shù)執(zhí)行之前或者后面添加功能刃唐。
應(yīng)用場景:
參數(shù)檢查(Agrument checking)
緩存(Caching)
代理(Proxy)
提供上下文(Context Provider)
裝飾器執(zhí)行/裝飾順序:
裝飾由下到上 執(zhí)行由上到下
舉例:
def add_fun(func3):
# 定義不定長參數(shù) 接收
def fun_in(*args, **kwargs):
print("---add----")
# 無論有沒有返回值 都接受
ret = func3(*args, **kwargs)
return ret
return fun_in
# 裝飾有參數(shù)的函數(shù)
@add_fun
def func(fun):
print("fun ", fun)
# 裝飾有返回值的函數(shù)
@add_fun
def func1():
return "func1"
if __name__ == '__main__':
func(123)
ret = func1()
print(ret)
閉包和裝飾器區(qū)別:
裝飾器需要傳遞被裝飾的函數(shù)對象給裝飾器
閉包則需要傳遞變量給內(nèi)嵌函數(shù)