python中的閉包以及對裝飾器的理解

2021-08-11 06:40:19 字數 2795 閱讀 3584

簡單說,閉包就是根據不同的配置資訊得到不同的結果

再來看看專業的解釋:閉包(closure)是詞法閉包(lexical closure)的簡稱,是引用了自由變數的函式。這個被引用的自由變數將和這個函式一同存在,即使已經離開了創造它的環境也不例外。所以,有另一種說法認為閉包是由函式和與其相關的引用環境組合而成的實體。

看概念總是讓人摸不著頭腦,看幾個python小例子就會了

def

make_adder

(addend):

defadder

(augend):

return augend + addend

return adder

p = make_adder(23)

q = make_adder(44)

print p(100)

print q(100)

執行結果:
123

144

分析一下:

我們發現,make_adder是乙個函式,包括乙個引數addend,比較特殊的地方是這個函式裡面又定義了乙個新函式,這個新函式裡面的乙個變數正好是外部make_adder的引數.也就是說,外部傳遞過來的addend引數已經和adder函式繫結到一起了,形成了乙個新函式,我們可以把addend看做新函式的乙個配置資訊,配置資訊不同,函式的功能就不一樣了,也就是能得到定製之後的函式.

再看看執行結果,我們發現,雖然p和q都是make_adder生成的,但是因為配置引數不同,後面再執行相同引數的函式後得到了不同的結果.這就是閉包.

def

hellocounter

(name):

count=[0]

defcounter

(): count[0]+=1

print

'hello,',name,',',str(count[0])+' access!'

return counter

hello = hellocounter('ma6174')

hello()

hello()

hello()

執行結果
hello, ysisl , 1 access!

hello, ysisl , 2 access!

hello, ysisl , 3 access!

分析一下

這個程式比較有趣,我們可以把這個程式看做統計乙個函式呼叫次數的函式.count[0]可以看做乙個計數器,沒執行一次hello函式,count[0]的值就加1。也許你會有疑問:為什麼不直接寫count而用乙個列表?這是python2的乙個bug,如果不用列表的話,會報這樣乙個錯誤:

unboundlocalerror: local variable 'count' referenced before assignment.

什麼意思?就是說conut這個變數你沒有定義就直接引用了,我不知道這是個什麼東西,程式就崩潰了.於是,再python3裡面,引入了乙個關鍵字:nonlocal,這個關鍵字是幹什麼的?就是告訴python程式,我的這個count變數是再外部定義的,你去外面找吧.然後python就去外層函式找,然後就找到了count=0這個定義和賦值,程式就能正常執行了.

python3 **

def

hellocounter

(name):

count=0

defcounter

():nonlocal count

count+=1

print

'hello,',name,',',str(count[0])+' access!'

return counter

hello = hellocounter('ma6174')

hello()

hello()

hello()

關於這個問題的研究您可以參考

def

makebold

(fn):

def():

return

"" + fn() + ""

defmakeitalic

(fn):

def():

return

"" + fn() + ""

@makebold

@makeitalic

defhello

():return

"hello world"

print hello()

執行結果

hello worldi>

b>

簡單分析

怎麼樣?這個程式熟悉嗎?這不是傳說的的裝飾器嗎?對,這就是裝飾器,其實,裝飾器就是一種閉包,我們再回想一下裝飾器的概念:對函式(引數,返回值等)進行加工處理,生成乙個功能增強版的乙個函式。再看看閉包的概念,這個增強版的函式不就是我們配置之後的函式嗎?區別在於,裝飾器的引數是乙個函式或類,專門對類或函式進行加工處理。

python裡面的好多高階功能,比如裝飾器,生成器,列表推到,閉包,匿名函式等,開發中用一下,可能會達到事半功倍的效果!

python閉包以及裝飾器

通俗的定義 如果在乙個內部函式裡,對在外部作用域 但不是在全域性作用域 的變數進行引用,那麼內部函式就被認為是閉包 closure 它只不過是個 內層 的函式,由乙個名字 變數 來指代,而這個名字 變數 對於 外層 包含它的函式而言,是本地變數 1 示例一 2 usr bin python 3 en...

python閉包以及裝飾器

閉包 簡單理解 所謂閉包簡單點說就是定義乙個函式,這個函式裡面還有乙個函式,此時裡面的函式和外面函式中的變數之間就產生了閉包關係。理解 def test num 裡面還有乙個函式 def test inner num inner 這個函式和外面函式的變數num之間就產生了閉包 print num n...

python閉包以及裝飾器

所謂閉包簡單點說就是定義乙個函式,這個函式裡面還有乙個函式,此時裡面的函式和外面函式中的變數之間就產生了閉包關係。定義乙個函式 def test num 裡面還有乙個函式 def test inner num inner 這個函式和外面函式的變數num之間就產生了閉包 print num num i...