十三 區域性函式及用法 python

2021-10-11 21:44:47 字數 2190 閱讀 4736

通過前面的學習我們知道,python 函式內部可以定義變數,這樣就產生了區域性變數,有讀者可能會問,python 函式內部能定義函式嗎?答案是肯定的。python 支援在函式內部定義函式,此類函式又稱為區域性函式。

那麼,區域性函式有哪些特徵,在使用時需要注意什麼呢?接下來就給讀者詳細介紹 python 區域性函式的用法。

首先,和區域性變數一樣,預設情況下區域性函式只能在其所在函式的作用域內使用。舉個例子:

#全域性函式

defoutdef()

:#區域性函式

defindef()

:print

("")#呼叫區域性函式

indef(

)#呼叫全域性函式

outdef(

)

程式執行結果為:

就如同全域性函式返回其區域性變數,就可以擴大該變數的作用域一樣,通過將區域性函式作為所在函式的返回值,也可以擴大區域性函式的使用範圍。例如,修改上面程式為:

#全域性函式

defoutdef()

:#區域性函式

defindef()

:print

("呼叫區域性函式"

)#呼叫區域性函式

return indef

#呼叫全域性函式

new_indef = outdef(

)呼叫全域性函式中的區域性函式

new_indef(

)

程式執行結果為:

呼叫區域性函式
因此,對於區域性函式的作用域,可以總結為:如果所在函式沒有返回區域性函式,則區域性函式的可用範圍僅限於所在函式內部;反之,如果所在函式將區域性函式作為返回值,則區域性函式的作用域就會擴大,既可以在所在函式內部使用,也可以在所在函式的作用域中使用。

以上面程式中的 outdef() 和 indef() 為例,如果 outdef() 不將 indef 作為返回值,則 indef() 只能在 outdef() 函式內部使用;反之,則 indef() 函式既可以在 outdef() 函式內部使用,也可以在 outdef() 函式的作用域,也就是全域性範圍內使用。

另外值得一提的是,如果區域性函式中定義有和所在函式中變數同名的變數,也會發生「遮蔽」的問題。例如:

#全域性函式

defoutdef()

: name =

"所在函式中定義的 name 變數"

#區域性函式

defindef()

:print

(name)

name =

"區域性函式中定義的 name 變數"

indef(

)#呼叫全域性函式

outdef(

)

執行此程式,python 直譯器會報如下錯誤:

unboundlocalerror: local variable 'name' referenced before assignment
此錯誤直譯過來的意思是「區域性變數 name 還沒定義就使用」。導致該錯誤的原因就在於,區域性函式 indef() 中定義的 name 變數遮蔽了所在函式 outdef() 中定義的 name 變數。再加上,indef() 函式中 name 變數的定義位於 print() 輸出語句之後,導致 print(name) 語句在執行時找不到定義的 name 變數,因此程式報錯。

由於這裡的 name 變數也是區域性變數,因此前面章節講解的 globals() 函式或者 globals 關鍵字,並不適用於解決此問題。這裡可以使用 python 提供的 nonlocal 關鍵字。

例如,修改上面程式為:

#全域性函式

defoutdef()

: name =

"所在函式中定義的 name 變數"

#區域性函式

defindef()

:nonlocal name

print

(name)

#修改name變數的值

name =

"區域性函式中定義的 name 變數"

indef(

)#呼叫全域性函式

outdef(

)

程式執行結果為:

所在函式中定義的 name 變數

python區域性函式

前邊文章我們介紹的函式都是定義在全域性環境中的,都是全域性函式。python還支援在函式體內定義函式,稱為區域性函式。這篇文章著重說下區域性函式內的變數也會遮蔽 hide def fn name 雞小西 def local print name unboundlocalerror local var...

python中random函式及用法

1 python中的random函式 random 方法返回隨機生成的乙個實數,它在 0,1 範圍內 import random random.random randint函式,返回指定範圍的乙個隨機整數,包含上下限 random.randint 0,99 返回0 99之間的整數 randrange...

Python 函式裝飾器及用法

函式裝飾器的工作原理是怎樣的呢?假設用 funa 函式裝飾器去裝飾 funb 函式,如下所示 funa 作為裝飾器函式 deffuna fn fn 執行傳入的fn引數 return funa deffunb 實際上,上面程式完全等價於下面的程式 def funa fn fn 執行傳入的fn引數 re...