Python閉包和裝飾器再複習

2022-02-21 13:08:20 字數 1023 閱讀 5807

在乙個外函式中定義了乙個內函式,並且內函式用到了外部函式的變數,而且外函式的返回值內函式的引用,這就構成了乙個閉包。

一般情況下,在我們認知當中,如果乙個函式結束,函式的內部所有東西都會釋放掉,還給記憶體,區域性變數都會消失。但是閉包是一種特殊情況,如果外函式在結束的時候發現有自己的臨時變數將來會在內部函式中用到,就把這個臨時變數繫結給了內部函式,然後自己再結束。

當乙個內嵌函式引用其外部作作用域的變數,我們就會得到乙個閉包. 重點是函式執行後並不會被撤銷,只是遷移到內函式上 ,總結一下,建立乙個閉包必須滿足以下幾點:

必須有乙個內嵌函式

內嵌函式必須引用外部函式中的變數

外部函式的返回值必須是內嵌函式

#

wai_fuc是外部函式,a和b都是外部函式的變數

defwai_fuc(a):

b = 10

#nei_fuc是內部函式

defnei_fuc():

#在這個內函式中,用到了外部函式的變數

print(a +b)

#外函式的返回值是內函式的引用

return

nei_fuc

if__name__ == '

__main__':

#呼叫了外部函式,並傳入變數,此時a=20,b=10.並建立了內部函式,然後又把內部函式的引用返回給了外部函式

demo1 = wai_fuc(20)

#demo1存了外函式的返回值(外函式的返回值是內函式的引用),這裡相當於執行了內部函式

demo1() #

30demo2 = wai_fuc(30)

demo2()

#40

外函式結束的時候發現內部函式將會用到自己的臨時變數,這兩個臨時變數就不會釋放,會繫結給這個內部函式,因此外函式的結束並沒有清空a,b的數值,而是繫結給了內函式。

python裝飾器和閉包

下面幾個部落格有裝飾器的講解,也包含了裝飾器幾種情況的例子,比如說被裝飾的函式帶引數,裝飾器本身帶引數等。理解python中的裝飾器 python裝飾器學習 例子 其實裝飾器跟設計模式中的裝飾器模式基本一樣,就是在已有的函式上新增新的功能,這也是自己對裝飾器的一點簡陋的理解了。下面是自己寫的簡單例子...

python閉包和裝飾器

要理解裝飾器,就要明白閉包 要明白閉包,首先就要從高階函式和作用域說起 說道作用域,一般會談到legb規則。所謂的legb l locals,當前命名空間 區域性作用域 e enclosing,外部函式的命名空間 外部作用域 g global,全域性的命名空間 b bulit in,內建的命名空間平...

python 閉包和裝飾器

閉包的寫法,兩層函式的巢狀,外部函式返回內部函式的引用,外層函式都帶引數 def 外層函式的名稱 引數 def 內層函式的名稱 pass return 內層函式的引用 def set fun func func 254 defcall fun nonlocal func 修改外層函式的值,並且內部函...