python中的閉包

2021-09-22 07:15:07 字數 2797 閱讀 1630

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

再來看看專業的解釋:閉包(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中閉包 python中的閉包

一 定義 如果在乙個內部函式裡,對在外部作用域 但不是在全域性作用域 的變數進行引用,那麼內部函式就被認為是閉包 closure 這個定義是相對直白的,閉包有三個條件 1.函式巢狀 2,內部函式呼叫外部函式的變數 3.返回內部函式 defa a defb b s a breturnsreturnb ...

python 閉包 Python中的閉包

一 什麼是閉包 在談之前,我們先來說說作用域,變數的作用域無非就兩種 全域性變數和區域性變數。函式內部可以直接讀取全域性變數,但是在函式外部無法讀取函式內部的區域性變數。出於種種原因,我們有時候需要獲取到函式內部的區域性變數。但是,正常情況下,這是辦不到的!只有通過變通的方法才能實現。於是就引入了閉...

閉包 Python中的閉包

通俗地講就是別人家有某個東西,你想拿到但是因為許可權不夠 不打死你才怪 但是你可以跟家裡的孩子套近乎,通過他拿到!這個家就是區域性作用域,外部無法訪問內部變數,孩子是從家裡返回物件,對家裡的東西有訪問許可權,借助返回物件間接訪問內部變數!def outer 別人家 x 10 別人家裡的東西 def ...