python中閉包 python中的閉包

2021-10-19 01:49:55 字數 1851 閱讀 1474

一 .定義

如果在乙個內部函式裡,對在外部作用域(但不是在全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包(closure).這個定義是相對直白的,

閉包有三個條件:

1.函式巢狀

2,內部函式呼叫外部函式的變數

3.返回內部函式

defa(a):defb(b):

s= a +breturnsreturnb

cd=a(6)

ss= cd(4)print(ss)#結果為10

二 閉包中注意的事項

閉包中是不能修改外部作用域的區域性變數的值

1 deffoo():2 m =03 deffoo1():4 m = 1

5 print(m)6 print(m)7 foo1()8 print(m)9 foo()

以下這段**是在python中使用閉包時一段經典的錯誤**

這段程式的本意是要通過在每次呼叫閉包函式時都對變數a進行遞增的操作。但在實際使用時

deffoo():

a= 1

defbar():

a= a + 1

returnareturn bar

這是因為在執行** c = foo()時,python會匯入全部的閉包函式體bar()來分析其的區域性變數,python規則指定所有在賦值語句左面的變數都是區域性變數,則在閉包bar()中,變數a在賦值符號"="的左面,被python認為是bar()中的區域性變數。再接下來執行print c()時,程式執行至a = a + 1時,因為先前已經把a歸為bar()中的區域性變數,所以python會在bar()中去找在賦值語句右面的a的值,結果找不到,就會報錯。解決的方法很簡單,使用語句nonloacal a就可以了,該語句顯式的指定a不是閉包的區域性變數。

方法一deffoo():

a= [1]defbar():

a[0]= a[0] + 1

returna[0]return bar

方法二deffoo():

a= 1

defbar():

nonlocal a

a= a + 1

returnareturnbar

c=foo()print(c())

經典錯誤問題:

flist =for i in range(3):def foo(x):

print x +i

f(2)

可能有些人認為這段**的執行結果應該是2,3,4.但是實際的結果是4,4,4。這是因為當把函式加入flist列表裡時,python還沒有給i賦值,只有當執行時,再去找i的值是什麼,這時在第乙個for迴圈結束以後,i的值是2,所以以上**的執行結果是4,4,4.解決方法也很簡單,改寫一下函式的定義就可以了。

for i in range(3):def foo(x,y=i):print x +y

三 閉包的用途

1 .當閉包執行完後,仍然能夠保持住當前的執行環境。

2.閉包可以根據外部作用域的區域性變數來得到不同的結果,這有點像一種類似配置功能的作用,我們可以修改外部的變數,閉包根據這個變數展現出不同的功能。

1 defmake_filter(keep):2 defthe_filter(file_name):3 file =open(file_name)4 lines =file.readlines()5 file.close()6 filter_doc = [i for i in lines if keep ini]7 returnfilter_doc8 return the_filter

如果我們需要取得檔案"result.txt"中含有"pass"關鍵字的行,則可以這樣使用例子程式

filter = make_filter("pass")

filter_result = filter("result.txt")

python 閉包 Python中的閉包

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

python 閉包 python 閉包

閉包 因為python中函式也可以當作物件,所以如果出現當我們返回乙個函式,而該函式含有外部變數的時候就形成了閉包。閉包的特點 是個巢狀函式 可以獲得非區域性的變數 將函式當作物件返回 看乙個例子會更易理解 def make printer msg msg hi there def printer ...

閉包 Python中的閉包

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