最近在學習 python 的過程中遇到了閉包這一概念,現總結如下:
咱們看看下面一段**:
def
greetingconfig
(prefix)
:def
greeting
(postfix)
:print
(prefix, postfix)
return greeting
m = greetingconfig(
'good morning!')m(
'july')m(
'mike'
)
這段**實現了乙個打招呼的函式 greetingconfig(),實現該程式的結果為:
good morning! july
good morning! mike
在以上程式中,greetingconfig() 函式巢狀 greeting() 函式,且 greeting() 函式的引用作為返回值。greeting() 函式訪問上一級函式的變數 prefix。此時,greetingconfig() 函式就是閉包。
閉包(closure)是詞法閉包(lexical closure)的簡稱,是引用自由變數的函式。這個被引用的自由變數將與這個函式一同存在,即使已經離開創造它的環境也不例外。所以,閉包是由函式和與其相關的引用環境組合而成的實體。閉包是函式中提出的乙個概念,要形成乙個完整嚴格的閉包,需要滿足以下條件(三個條件,缺一不可):
格式
def 外部函式():
...def 內部函式():
...return 內部函式引用
作用import math
# 不使用閉包需要4個引數
defdis_bt_point
(x1, y1, x2, y2)
:return math.sqrt(
pow(x1 - x2,2)
+pow
(y1 - y2,2)
)# 不使用閉包的呼叫求距離函式
print
('點(10,10)到座標(0,0)的距離:'
.format
(dis_bt_point(0,
0,10,
10)))
print
('點(20,10)到座標(0,0)的距離:'
.format
(dis_bt_point(0,
0,20,
10)))
# 閉包
defdisout
(x1, y1)
:def
disin
(x2, y2)
:return math.sqrt(
pow(x1 - x2,2)
+pow
(y1 - y2,2)
)return disin
distance = disout(0,
0)# 獲取點(10,10)到座標(0,0)的距離
print
('點(10,10)到座標(0,0)的距離:'
.format
(distance(10,
10)))
# 獲取點(20,10)到座標(0,0)的距離
print
('點(20,10)到座標(0,0)的距離:'
.format
(distance(20,
10)))
執行結果:
點(10
,10)到座標(0
,0)的距離:14.14
點(20
,10)到座標(0
,0)的距離:22.36
點(10
,10)到座標(0
,0)的距離:14.14
點(20
,10)到座標(0
,0)的距離:22.36
import time
defwrite_log
(func)
:try
:with
open
('log.txt'
,'a'
, encoding=
'utf-8'
)as f:
# 寫入相關資料資訊(訪問的函式名,訪問的時間)
f.write(func.__name__)
f.write(
'\t'
)# 寫入訪問時間
f.write(time.asctime())
f.write(
'\n'
)except exception as e:
print
(e)# 閉包
deffuncout
(func)
:def()
: write_log(func)
func(
)def
func1()
:print
('功能1'
)def
func2()
:print
('功能2'
)if __name__ ==
'__main__'
: func1(
) func2(
)
執行結果:
功能1
功能2
func1 mon dec 721:
39:272020
func2 mon dec 721:
39:272020
特點
示例**
a =
100def
func()
: b =
99def
inner_func()
:global a
nonlocal b
c =88 a +=
10 b +=
1 c +=
12print
(a, b, c)
inner_func(
)print
(locals()
)print
(globals()
)if __name__ ==
'__main__'
: func(
)# 執行結果:
110100
100,
'__builtins__'
:(built-in)
>
,'__file__'
:'e:/pythonproject/test.py'
,'__cached__'
:none
,'math'
:(built-in)
>
,'random'
:from
'e:\\python\\lib\\random.py'
>
,'quadratic'
:>
,'a'
:110
,'func'
:>
}
def
counter()
: count =[0
]def
add_one()
: count[0]
+=1print
('當前是第{}次訪問'
.format
(count[0]
))return add_one
if __name__ ==
'__main__'
: count = counter()
count(
) count(
) count(
)# 執行結果:
當前是第1次訪問
當前是第2次訪問
當前是第3次訪問
閉包中內部函式訪問外部函式內的變數時,內部函式在呼叫完後並不會立即將該記憶體空間**,而是會一直保持呼叫時的狀態。用不同的引數值進行呼叫時,會另外開闢一塊記憶體空間進行儲存,而不會影響之前的引用內容。
Python中的內部函式和閉包
python支援函式內嵌 def fun1 print fun1 正在被呼叫.def fun2 print fun2 正在被呼叫.fun2 fun1 fun1 正在被呼叫.fun2 正在被呼叫.fun2 traceback most recent call last file line 1,in f...
函式閉包python中的閉包
本文純屬個人見解,是對前面學習的總結,如有描述不正確的地方還請高手指正 單簡說,閉包就是根據不同的置配息信到得不同的結果 再來看看專業的解釋 閉包 closure 是詞法閉包 lexical closure 的簡稱,是引用了由自變數的函式。這個被引用的由自變數將和這個函式一起存在,即使已離開了造創它...
python中函式閉包
閉包 乙個函式巢狀另乙個函式,外面的函式簡稱為外函式,裡面的為內函式,外函式返回內函式。與普通函式不同的是,普通函式呼叫完後,函式中的區域性變數消失,返回記憶體,而閉包外函式呼叫後,外函式的區域性變數沒有消失,而是繼續留給內函式使用。1,普通函式 deffn a 2return a fn print...