1. 程式人生 > >Python閉包、裝飾器

Python閉包、裝飾器

閉包,將組成函式的語句和對應的執行環境打包在一起得到的物件

閉包最重要的使用價值在於:封存函式執行的上下文環境;閉包在其捕捉的執行環境(def語句塊所在上下文)中,也遵循LEGB規則逐層查詢,直至找到符合要求的變數,或者丟擲異常。

對於巢狀函式,閉包將會捕捉內層函式執行所需的整個環境

閉包必需的三大條件:函式巢狀、內部函式引用外部變數、外部函式需返回內層函式

#閉包:
def FuncX(x):
    print("start")
    def FuncY(y):
        print("函式內")
        return x*y
    print("end")
    return 
FuncY x=FuncX(3) print(x(4))
start
end
函式內
12

封存上下文這一特性可被巧妙的用於現有函式的包裝,從而為現有函式增加功能,即裝飾器

裝飾器就是閉包,但裝飾器傳入的引數是函式

因為python是一門膠水語言,在python一切皆是物件,python中全部都是引用型別

因此函式可以像變數一樣被指向和傳遞。

def add(a,b):
    return a+b
def checkParams(fn):
    def wrapper(a,b):
        if isinstance(a,(int,float)) and isinstance(b,(int,float
)): return fn(a,b) print("variable'a' and 'b' cannot be added") return return wrapper wrapper=checkParams(add) result=wrapper(2,3) print(result) def diguo(): print("diguo50") return 50 def doupi(fn): def jiadoupi(): print("麻醬豆皮10") return fn()+10
return jiadoupi def xiangcai(fn): def jiaxiangcai(): print("majiangxiagncai5") return fn()+5 return jiaxiangcai aa=doupi(xiangcai(diguo)) print(aa()) print(diguo)
5
麻醬豆皮10
majiangxiagncai5
diguo50
65
<function diguo at 0x02AA58E8>