助你熟練運用Python中的閉包

2021-09-25 06:22:51 字數 4314 閱讀 4152

引入閉包

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

我們就可以通過咱們今天學習的閉包來解決這個需求。

1 閉包的定義

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

2 簡單閉包的示例**

def

func_out

(num1)

:def

func_inner

(num2)

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

result = num1 + num2

print

("結果是:"

, result)

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

f = func_out(1)

# 建立閉包例項 f(2

)# 執行閉包 1 + 2 = 3f(3

)===執行結果:

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

=結果是:

3結果是:

4

2.1閉包執行結果的說明

2.2實現閉包的標準格式

def

out(a)

: b =

10def

inner()

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

print

(a, b)

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

3 閉包的使用

示例: 使用閉包,實現不同人的對話

def

config_name

(name)

:def

say_info

(info)

:print

(name +

": "

+ info)

return say_info

tom = config_name(

"tom"

)jerry = config_name(

"jerry"

)tom(

"hey, jerry! 我們一起玩吧!"

)jerry(

"呵呵噠, 不和你玩!"

)tom(

"來呀~ 來呀~"

)jerry(

"滾犢子!")==

=執行結果:

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

=tom: hey, jerry! 我們一起玩吧!

jerry: 呵呵噠, 不和你玩!

tom: 來呀~ 來呀~

jerry: 滾犢子!

4 在閉包內部修改閉包外部變數nonlocal
def

func_out

(num1)

:def

func_inner

(num2)

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

num1 =

10# 修改外部變數num1

result = num1 + num2 # 內部函式使用了外部函式的變數(num1)

print

("計算結果:"

, result)

print

("num1:"

, num1)

func_inner(1)

print

("num1:"

, num1)

return func_inner

f = func_out(3)

f(2)==

=執行結果:

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

=num1:

3計算結果:

11num1:

10# 閉包內,修改外部變數成功

計算結果:

12

沒有使用nonlocal的示例:

def

func_out

(num1)

:def

func_inner

(num2)

: num1 =

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

result = num1 + num2 # 內部函式使用了外部函式的變數(num1)

print

("計算結果:"

, result)

print

("num1:"

, num1)

func_inner(1)

print

("num1:"

, num1)

return func_inner

f = func_out(3)

f(2)==

=執行結果:

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

=num1:

3計算結果:

11num1:

3# 閉包內,修改外部變數失敗

計算結果:

12

閉包內不做變數的修改(作為對比,便於理解)

def

func_out

(num1)

:def

func_inner

(num2)

: result = num1 + num2

print

("計算結果:"

, result)

print

("num1:"

, num1)

func_inner(1)

print

("num1:"

, num1)

return func_inner

f = func_out(3)

f(2)==

=執行結果:

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

====

=num1:

3計算結果:

4num1:

3計算結果:

5

python閉包的運用

閉包就是內層函式,對外層函式 非全域性 的變數的引 叫閉包 def func1 name alex def func2 print name 閉包func2 func1 結果 alex 我們可以使 closure 來檢測函式是否是閉包.使 函式名.closure 返回cell就是 閉包.返回none...

閉包的運用

function person name return var littleming person fool littleming.getname 在我理解,getname getname仍返回函式getname,只不過將其當作person的物件的乙個屬性,等同於下面這個函式 function pe...

python中閉包 python中的閉包

一 定義 如果在乙個內部函式裡,對在外部作用域 但不是在全域性作用域 的變數進行引用,那麼內部函式就被認為是閉包 closure 這個定義是相對直白的,閉包有三個條件 1.函式巢狀 2,內部函式呼叫外部函式的變數 3.返回內部函式 defa a defb b s a breturnsreturnb ...