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

Python:閉包與裝飾器

閉包:

在函式內部再定義一個函式,並且內部這個函式用到了外邊函式的變數,那麼將內部函式以及用到的一些變數稱之為閉包。

# 兩個函式巢狀,外層函式返回內層函式的引用,  外層函式必須傳引數-->外層函式不傳參相當於只定義內層函式,沒有什麼用。

注意點:

由於閉包引用了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放,消耗記憶體。

裝飾器:

上例 @w1內部會執行一下操作: @函式名 是python的一種語法糖。

執行w1函式 ,並將 @w1 下面的函式作為w1函式的引數,即:@w1 等價於 w1(f1) 所以,內部就會去執行:

def w1(func):
    def inner():
        # 驗證1
        # 驗證2
        # 驗證3
        func()
    return inner

@w1
def f1():
    print('f1')

w1的返回值

將執行完的w1函式返回值 賦值 給@w1下面的函式的函式名f1 即將w1的返回值再重新賦值給 f1,即:

新f1 = def inner(): 
            #驗證 1
            #驗證 2
            #驗證 3
            原來f1()
        return inner

所以,以後業務部門想要執行 f1 函式時,就會執行 新f1 函式,在新f1 函式內部先執行驗證,再執行原來的f1函式,然後將原來f1 函式的返回值返回給了業務呼叫者 

如此一來, 即執行了驗證的功能,又執行了原來f1函式的內容,並將原f1函式返回值 返回給業務呼叫著

 程式碼執行順序:第1行(指向了2-5行)--> 第7 行-->第6行-->第5行--> 第11行-->3-->4-->8