Python閉包的淺薄認知1

2021-08-28 06:51:43 字數 1289 閱讀 5138

閉包定義:內層函式引用了外層函式的變數(引數也算變數),然後返回內層函式的情況,稱為閉包(closure)
例一:

def f():

print('f() 外部函式....')

def g():

print('g()內部函式....')

return g

print(f())

輸出結果如下:

f() 外部函式....

.g at 0x00ed26f0>

由此可見閉包函式的返回值其實是乙個指向要返回的內部函式的指標。

而例一也不能算是乙個嚴格意義上的閉包函式,因為它不滿足引用外層函式變數或者引數

例二:

def calc_sum(lst):

def lazy_sum():

return sum(lst)

return lazy_sum

f=calc_sum([1,2,3,4])

print(f())

輸出結果為10

這才算是乙個嚴格意義上的閉包。

例三:接下來解決乙個比較繞的問題,但其實並不複雜

# 希望一次返回3個函式,分別計算1x1,2x2,3x3:

def count():

fs =

for i in range(1, 4):

def f():

return i*i

return fs

f1, f2, f3 = count()

print(f1(),f(),f3())

當然,上述的返回值當然是錯誤的。返回的結果為9,9,9。而不是1,4,9

可能有小夥伴問了,何必搞那麼複雜直接返回乙個帶值得陣列不就好了嘛?而這裡我想提醒的是,我們要學習的是閉包,而閉包的返回值必須為函式,不可以是數值,這不清真!!!

print(f1,f2,f3)

而結果是三個位址並不相同,而是因為三個函式的引數i都是相同的i值為3

當for語句執行時,記憶體空間中的i值會依次遞增,直到三個函式都被建立完畢。而此時i值也將定格在3,雷打不動

而這三個函式的返回都是 i*i 即3*3=9

所以閉包中必須避免:返回函式不要引用任何迴圈變數,或者後續會發生變化的變數。

接下來我們執行這樣的改動

為函式f()傳遞乙個區別於i的引數,並且在追加時傳入形參i,在執行過程中i分別對應實參1,2,3,即fs=[f(1),f(2),f(3)]

在輸出時i的值將不再影響計算結果。

如果你非要醬紫寫,雖然結果是對的,那就又不清真了,因為這不是乙個閉包

python 閉包 python 閉包

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

python怎麼閉包 python的閉包

一 思考乙個問題 我們要給定乙個x,要求一條直線上x對應的y的值。公式是y kx b。我們需要用k,b來確定這條直線,則我們實現的函式應該有3個引數 defline k,b,x print k x b line 1,3,4 line 1,3,5 line 1,3,6 可以看到,我們每次修改x都要重新...

python 閉包 Python中的閉包

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