87 python高階 閉包

2021-09-26 07:12:35 字數 2757 閱讀 3184

def

test1()

:print

("--- in test1 func----"

)#呼叫函式

test1(

)#引用函式

ret = test1

print(id

(ret)

)print(id

(test1)

)#通過引用呼叫函式

ret(

)

執行結果:

--- in test1 func----

140212571149040

140212571149040

--- in test1 func----

#定義乙個函式

deftest

(number)

:#在函式內部再定義乙個函式,並且這個函式用到了外邊函式的變數,那麼將這個函式以及用到的一些變數稱之為閉包

deftest_in

(number_in)

:print

("in test_in 函式, number_in is %d"

%number_in)

return number+number_in

#其實這裡返回的就是閉包的結果

return test_in

#給test函式賦值,這個20就是給引數number

ret = test(20)

#注意這裡的100其實給引數number_in

print

(ret(

100)

)#注意這裡的200其實給引數number_in

print

(ret(

200)

)

執行結果:

in test_in 函式, number_in is 100

120in test_in 函式, number_in is 200

220

內部函式對外部函式作用域裡變數的引用(非全域性變數),則稱內部函式為閉包。

# closure.py

defcounter

(start=0)

: count=

[start]

defincr()

: count[0]

+=1return count[0]

return incr

啟動python直譯器

>>

>

import closeure

>>

>c1=closeure.counter(5)

>>

>

print

(c1())

6>>

>

print

(c1())

7>>

>c2=closeure.counter(

100)

>>

>

print

(c2())

101>>

>

print

(c2())

102

nonlocal訪問外部函式的區域性變數(python3)

def

counter

(start=0)

:def

incr()

:nonlocal start

start +=

1return start

return incr

c1 = counter(5)

print

(c1())

print

(c1())

c2 = counter(50)

print

(c2())

print

(c2())

print

(c1())

print

(c1())

print

(c2())

print

(c2(

))

def

line_conf

(a, b)

:def

line

(x):

return a*x + b

return line

line1 = line_conf(1,

1)line2 = line_conf(4,

5)print

(line1(5)

)print

(line2(5)

)

這個例子中,函式line與變數a,b構成閉包。在建立閉包的時候,我們通過line_conf的引數a,b說明了這兩個變數的取值,這樣,我們就確定了函式的最終形式(y = x + 1和y = 4x + 5)。我們只需要變換引數a,b,就可以獲得不同的直線表達函式。由此,我們可以看到,閉包也具有提高**可復用性的作用。

如果沒有閉包,我們需要每次建立直線函式的時候同時說明a,b,x。這樣,我們就需要更多的引數傳遞,也減少了**的可移植性。

閉包思考:

1.閉包似優化了變數,原來需要類物件完成的工作,閉包也可以完成

2.由於閉包引用了外部函式的區域性變數,則外部函式的區域性變數沒有及時釋放,消耗記憶體

8 7 python 日學 執行緒高階 協程

解決思路 利用同步來進行解決 執行緒執行函式1時,對其加鎖,使得函式2的請求加鎖的請求被阻礙,只有函式1完全執行完畢,釋放鎖後,執行緒2才能得到鎖,繼續執行下去。2.非同步 同步呼叫就是你喊朋友去吃飯,朋友在忙,你就一直等,等你朋友忙完,你們再一起去吃飯 非同步呼叫就是你喊朋友去吃飯,朋友在忙說忙完...

Python 高階函式 閉包

閉包 什麼是閉包 如果在乙個內部函式裡,對在外部作用域 但不是在全域性作用域 的變數進行引用,那麼內部函式就被認為是閉包。需要滿足的條件 1 乙個函式內巢狀乙個函式 2 外部函式的返回值必須是這個內部函式 3 內部函式必須使用外部函式中的區域性變數 def fun 1 num 1 9 def fun...

python高階之閉包

在函式巢狀的情況下,內部函式使用了外部函式的變數,並且外部函式返回了內部函式,我們就把這個使用了外部函式變數的內部函式稱為閉包。儲存外部函式內的變數,不會隨著外部函式呼叫而銷毀 def out func out num 10 def in func x print f 內部函式使用了外部函式的變數o...