目錄
一、閉包的概念
1.概念
2.閉包的特征
?3.閉包的作用
二、裝飾器
1.什么是裝飾器
2.裝飾器的作用
1.統計代碼耗時
2.對代碼進行權限檢查
3.記錄日志
3.閉包和裝飾器的關系
4.注意事項:
一、閉包的概念
1.概念
閉包(Closure)指一個函數捕獲并保存了其外部作用域的變量,即使外部函數已經執行完畢。閉包允許函數訪問其定義時的上下文環境,而不僅限于當前作用域。
2.閉包的特征
- 一個函數里嵌套另一個函數
- 內部函數引用外部函數的變量
- 外部函數返回內部函數本身,而不是調用結果
def outer_function(x):def inner_function(y):return x + y # 引用了外部函數的變量xreturn inner_function # 返回內部函數對象closure = outer_function(10)
print(closure(5)) # 輸出15(10 + 5)
?3.閉包的作用
- ??? 保留狀態:外層函數的變量不會因為函數執行完而被銷毀;
- ??? 實現工廠函數:比如創建多個帶不同參數的函數;
- ??? 實現裝飾器(decorators)的基礎。
二、裝飾器
1.什么是裝飾器
裝飾器是一種在閉包的基礎上,在不修改原函數代碼的基礎上,可以給函數擴展一些特定的功能,裝飾器本質也是一個函數,是一個接受函數作為參數的高階函數
2.裝飾器的作用
1.統計代碼耗時
import time
def cost_time(fun):def clac(*args):start = time.time()r = fun(*args)print(f"{fun.__name__}是{r}")end = time.time()print(f"耗時是{end - start}")return rreturn clacdef FB(i):if i == 1 or i == 2:return 1else:return FB(i-1) + FB(i - 2)def xh(n):a = 1b = 1for i in range(3,n + 1):c = a + ba = bb = cif i == n:return cdg = cost_time(xh)
FB = cost_time(FB)
FB(10)
dg(10)
2.對代碼進行權限檢查
from functools import wraps
user = None
def fun2(fun):@wraps(fun)def fun1():global userif user:fun()else:name = input("用戶名:")psd = input("密碼:")if name == 'admin' and psd == "123456":user = namefun()else:print("賬號或密碼輸入錯誤")return fun1
@fun2
def login():print("歡迎登錄")
@fun2
def shopping():print("歡迎來到購物車")def index():print("歡迎來到首頁")
login()
shopping()
3.記錄日志
from datetime import time,datetime,date
def log(fun):def log1(*args,**kwargs):print(f"{date.today()}進行了{fun.__name__}操作,變量有{args},關鍵字有{kwargs}")result = fun(*args)print(f"{date.today()}結束了{fun.__name__}操作,返回值有{result}")return resultreturn log1
@log
def add(a,b,c):c = a + b + creturn c
add(2, 3, 4, )
3.閉包和裝飾器的關系
裝飾器依賴閉包實現,裝飾器一般用于高級應用場景,專門用于函數增強
4.注意事項:
1.多層裝飾器是按照從上到下的順序執行
2.裝飾器會覆蓋原來函數名稱,可以用function.wraps來修復
3.閉包修改外部變量需要用nonlocal聲明變量