我們知道當函式呼叫完,函式內定義的變數都銷毀了,但是我們有時候需要儲存函式內的這個變數,每次在這個變數的基礎上完成一些列的操作,比如: 每次在這個變數的基礎上和其它數字進行求和計算,那怎麼辦呢?
我們就可以通過閉包來解決這個需求。
閉包的定義:在函式巢狀的前提下,內部函式使用了外部函式的變數,並且外部函式返回了內部函式,我們把這個使用外部函式變數的內部函式稱為閉包。
在函式巢狀(函式裡面再定義函式)的前提下
內部函式使用了外部函式的變數(還包括外部函式的引數)
外部函式返回了內部函式
# 定義乙個外部函式
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...