閉包
- 閉包實現
- 函數嵌套
- 外函數里包裝一個內函數
- 外函數作用域有一個局部數據對象
- 內部函數對于外部函數作用域里非全局變量的引用
- 外函數返回內部函數
def func_wai(a):
def func_nei():
print(a)
return func_nei()
與遞歸有些類似,將尾遞歸中return,調用自己,更改為了內部函數
閉包的意義
-
實現函數內部變量的延續(xù)
每個函數運行都會開辟新的內存空間,在函數結束時,內部變量都將被釋放
閉包則延續(xù)了局部變量的生命周期
-
變量生命周期得到延續(xù),同時也增加了內存損耗
def wai(): p = list(range(1000)) def nei(): p[0] += 1 print(p[0]) return nei func = wai() # p 是一個保持狀態(tài)的變量 #返回值載體 就相當于變量 #當你不去釋放一個變量,會一直存活的 -
變量私有化
每一次閉包函數執(zhí)行后的返回值都是一個新的,這是因為函數運行首先開辟的都是一塊新的函數臨時空間 每一次閉包函數執(zhí)行后,都是返回了一個不一樣的閉包函數載體,那么這個載體里的變量,也是不一樣的
裝飾器
- 裝飾器可以在函數運行前添加功能,并且不影響原有函數內容
- 實際是將函數作為一個參數,帶入到另外一個函數用運行
# 簡單的裝飾器
def wai(func):
def nei():
res = func()
return res + '你好'
return nei
@wai
def work():
return '123'
#------輸出---------
work()
-
被裝飾函數帶參數
def wai(func): #裝飾器 def nei(var1,var2): var1 = 100 #在閉包函數內部對被裝飾函數參數進行干預 var2 = 99 return func(var1,var2) return nei @wai def work(a,b): return a + b res = work(20,30) #wai(work)(a,b) print(res) -
裝飾器帶參數
def A(*args): def B(func): def C(a,b): print('我是被裝飾函數的參數:',a,b) print('我是裝飾函數的參數:',*args) return func return C return B @A('ss') def func(a,b): pass func(1,2) ---------- 我是被裝飾函數的參數: 1 2 我是裝飾函數的參數: ss -
過程分析
def wai(b_func): #外函數的參數是一個函數對象 def nei(): print("嘿嘿嘿") #在nei函數里寫的代碼基本上都是添加的功能 return b_func() #這個是nei函數返回值,用來返回之前在wai函數所接收的參數 #b_func() #return '' return nei #返回了wai函數里的這個定義好的閉包容器 @wai #語法糖 def func(): print('哈哈哈哈') return 'func' res = func() #調用一個被裝飾函數 其實相等于 wai(func)() print('func的返回值:',res) ------------------------------------- #func() 傳統函數調用 #1: print('哈哈哈') #2: return None #func() 被裝飾時調用 @wai #被裝飾函數: func #裝飾器函數: wai #1: wai(func) -> return nei #2: nei() -> #1: print("嘿嘿嘿") #2: return b_func() #1: b_func() -> 'func' #內部調用被裝飾函數 #2: return 'func' #內部閉包函數的返回值 其實是被裝飾函數的返回值