Python閉包函式

2021-10-12 07:54:09 字數 3029 閱讀 2337

我們知道當函式呼叫完,函式內定義的變數都銷毀了,但是我們有時候需要儲存函式內的這個變數,每次在這個變數的基礎上完成一些列的操作,比如: 每次在這個變數的基礎上和其它數字進行求和計算,那怎麼辦呢?

我們就可以通過閉包來解決這個需求。

閉包的定義:在函式巢狀的前提下,內部函式使用了外部函式的變數,並且外部函式返回了內部函式,我們把這個使用外部函式變數的內部函式稱為閉包。

在函式巢狀(函式裡面再定義函式)的前提下

內部函式使用了外部函式的變數(還包括外部函式的引數)

外部函式返回了內部函式

# 定義乙個外部函式

deffunc_out

(num1)

:# 定義乙個內部函式

deffunc_inner

(num2)

:# 內部函式使用了外部函式的變數(num1)

result = num1 + num2

print

("結果是:"

, result)

# 外部函式返回了內部函式,這裡返回的內部函式就是閉包

return func_inner

# 建立閉包例項

f = func_out(1)

# 執行閉包f(2

)# 3f(3

)# 4

閉包執行結果的說明:通過上面的輸出結果可以看出閉包儲存了外部函式內的變數num1,每次執行閉包都是在num1 = 1 基礎上進行計算。

閉包可以儲存外部函式內的變數,不會隨著外部函式呼叫完而銷毀。

注意點:由於閉包引用了外部函式的變數,則外部函式的變數沒有及時釋放,消耗記憶體。

1,當返回的內部函式使用了外部函式的變數就形成了閉包

2,閉包可以對外部函式的變數進行儲存

3,實現閉包的標準格式:

# 外部函式

deftest1

(a):

b =10# 內部函式

deftest2()

:# 內部函式使用了外部函式的變數或者引數

print

(a, b)

# 返回內部函式, 這裡返回的內部函式就是閉包例項

return test2

1. 案例

需求: 根據配置資訊使用閉包實現不同人的對話資訊,例如對話:

張三: 李雷: 吃飯了嗎?

李四: 還沒吃呢,一起吃不?

2. 實現步驟說明

1,定義外部函式接收不同的配置資訊引數,引數是人名

2,定義內部函式接收對話資訊引數

3,在內部函式裡面把配置資訊和對話資訊進行拼接輸出

3. 功能**的實現

# 需求: 根據配置資訊使用閉包實現不同人的對話資訊,例如對話:

# 李雷: 吃飯了嗎?

# 韓梅梅: 還沒吃呢,一起吃不?

defname

(name)

:def

say(say_info)

:print

('%s:%s'

%(name,say_info)

)return say

lilei = name(

'李雷'

)lilei(

'吃飯了嗎?')

hanmeimei = name(

'韓梅梅'

)hanmeimei(

'還沒吃呢,一起吃不?'

)###輸出結果

# 李雷:吃飯了嗎

# 韓梅梅:還沒吃呢,一起吃不?

閉包案例說明:閉包函式還可以提高**的可重用性,不需要再手動定義額外的功能函式。

小結:閉包不僅可以儲存外部函式的變數還可以提高**的可重用行。

修改閉包內使用的外部變數的錯誤示例:

# 定義乙個外部函式

deffunc_out

(num1)

:# 定義乙個內部函式

deffunc_inner

(num2)

:# 這裡本意想要修改外部num1的值,實際上是在內部函式定義了乙個區域性變數num1

num1 =

10# 內部函式使用了內部函式定義的區域性變數(num1)

result = num1 + num2

print

("結果是:"

, result)

print

(num1)

func_inner(1)

print

(num1)

# 沒有修改,結果仍然是外部函式的

# 外部函式返回了內部函式,這裡返回的內部函式就是閉包

return func_inner

# 建立閉包例項

f = func_out(1)

# 執行閉包f(2

)# 12

修改閉包內使用的外部變數的正確示例:

# 定義乙個外部函式

deffunc_out

(num1)

:# 定義乙個內部函式

deffunc_inner

(num2)

:# 這裡本意想要修改外部num1的值,實際上是在內部函式定義了乙個區域性變數num1

nonlocal num1 # 告訴直譯器,此處使用的是 外部變數a

# 修改外部變數num1

num1 =

10# 內部函式使用了外部函式的變數(num1)

result = num1 + num2

print

("結果是:"

, result)

print

(num1)

func_inner(1)

print

(num1)

# 此處使用的修改後的外部變數

# 外部函式返回了內部函式,這裡返回的內部函式就是閉包

return func_inner

# 建立閉包例項

f = func_out(1)

# 執行閉包f(2

)# 12

python閉包函式

python函式閉包 closure 比較抽象,在函式式程式設計中運用地比較多,通俗點就是子函式 內嵌函式 呼叫上層函式 閉包函式 的變數,且上層函式 閉包函式 接收的變數會儲存在子函式 內嵌函式 的變數中可以供子函式 內嵌函式 呼叫 概念很抽象,但是實現的例子還是比較容易理解的,這裡記住實現函式閉...

python閉包函式

python是一種物件導向的程式語言,在python中一切皆物件,這樣就使得變數所擁有的屬性,函式也同樣擁有。這樣我們就可以理解在函式內建立乙個函式的行為是完全合法的。這種函式被叫做內嵌函式,這種函式只可以在外部函式的作用域內被正常呼叫,在外部函式的作用域之外呼叫會報錯。而如果內部函式裡引用了外部函...

python閉包函式

在一些語言中,在函式中可以 巢狀 定義另乙個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在乙個函式與一組 私有 變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。維基百科。即在內部函式中引用了外部函式的變數,就是閉包函式。def mult...