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...