Python 中的內部函式 閉包

2021-10-25 05:41:51 字數 4185 閱讀 3263

最近在學習 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...