網(wǎng)站首頁 編程語言 正文
Python局部函數(shù)及用法
通過前面的學(xué)習(xí)我們知道,Python 函數(shù)內(nèi)部可以定義變量,這樣就產(chǎn)生了局部變量,有讀者可能會(huì)問,Python 函數(shù)內(nèi)部能定義函數(shù)嗎?答案是肯定的。Python 支持在函數(shù)內(nèi)部定義函數(shù),此類函數(shù)又稱為局部函數(shù)。
那么,局部函數(shù)有哪些特征,在使用時(shí)需要注意什么呢?接下來就給讀者詳細(xì)介紹 Python 局部函數(shù)的用法。
首先,和局部變量一樣,默認(rèn)情況下局部函數(shù)只能在其所在函數(shù)的作用域內(nèi)使用。舉個(gè)例子:
#全局函數(shù)
def outdef ():
#局部函數(shù)
def indef():
print("http://www.csdn.net/python/")
#調(diào)用局部函數(shù)
indef()
#調(diào)用全局函數(shù)
outdef()
程序執(zhí)行結(jié)果為:
http://www.csdn.net/python/
就如同全局函數(shù)返回其局部變量,就可以擴(kuò)大該變量的作用域一樣,通過將局部函數(shù)作為所在函數(shù)的返回值,也可以擴(kuò)大局部函數(shù)的使用范圍。例如,修改上面程序?yàn)椋?/p>
#全局函數(shù)
def outdef ():
#局部函數(shù)
def indef():
print("調(diào)用局部函數(shù)")
#調(diào)用局部函數(shù)
return indef
#調(diào)用全局函數(shù)
new_indef = outdef()
調(diào)用全局函數(shù)中的局部函數(shù)
new_indef()
程序執(zhí)行結(jié)果為:
調(diào)用局部函數(shù)
因此,對于局部函數(shù)的作用域,可以總結(jié)為:如果所在函數(shù)沒有返回局部函數(shù),則局部函數(shù)的可用范圍僅限于所在函數(shù)內(nèi)部;反之,如果所在函數(shù)將局部函數(shù)作為返回值,則局部函數(shù)的作用域就會(huì)擴(kuò)大,既可以在所在函數(shù)內(nèi)部使用,也可以在所在函數(shù)的作用域中使用。
以上面程序中的 outdef() 和 indef() 為例,如果 outdef() 不將 indef 作為返回值,則 indef() 只能在 outdef() 函數(shù)內(nèi)部使用;反之,則 indef() 函數(shù)既可以在 outdef() 函數(shù)內(nèi)部使用,也可以在 outdef() 函數(shù)的作用域,也就是全局范圍內(nèi)使用。
另外值得一提的是,如果局部函數(shù)中定義有和所在函數(shù)中變量同名的變量,也會(huì)發(fā)生“遮蔽”的問題。例如:
#全局函數(shù)
def outdef ():
name = "所在函數(shù)中定義的 name 變量"
#局部函數(shù)
def indef():
print(name)
name = "局部函數(shù)中定義的 name 變量"
indef()
#調(diào)用全局函數(shù)
outdef()
執(zhí)行此程序,Python 解釋器會(huì)報(bào)如下錯(cuò)誤:
UnboundLocalError: local variable 'name' referenced before assignment
此錯(cuò)誤直譯過來的意思是“局部變量 name 還沒定義就使用”。導(dǎo)致該錯(cuò)誤的原因就在于,局部函數(shù) indef() 中定義的 name 變量遮蔽了所在函數(shù) outdef() 中定義的 name 變量。再加上,indef() 函數(shù)中 name 變量的定義位于 print() 輸出語句之后,導(dǎo)致 print(name) 語句在執(zhí)行時(shí)找不到定義的 name 變量,因此程序報(bào)錯(cuò)。
由于這里的 name 變量也是局部變量,因此前面章節(jié)講解的 globals() 函數(shù)或者 globals 關(guān)鍵字,并不適用于解決此問題。這里可以使用 Python 提供的 nonlocal 關(guān)鍵字。
例如,修改上面程序?yàn)椋?/p>
#全局函數(shù)
def outdef ():
name = "所在函數(shù)中定義的 name 變量"
#局部函數(shù)
def indef():
nonlocal name
print(name)
#修改name變量的值
name = "局部函數(shù)中定義的 name 變量"
indef()
#調(diào)用全局函數(shù)
outdef()
程序執(zhí)行結(jié)果為:
所在函數(shù)中定義的 name 變量
原文鏈接:https://blog.csdn.net/m0_62617719/article/details/128380670
相關(guān)推薦
- 2022-06-29 C語言超詳細(xì)講解getchar函數(shù)的使用_C 語言
- 2022-09-13 ios開發(fā)Flutter之?dāng)?shù)據(jù)存儲_IOS
- 2022-12-16 Python海象運(yùn)算符代碼分析及知識點(diǎn)總結(jié)_python
- 2023-07-29 修改(elementui)el-table底層背景色
- 2022-06-14 教你使用docker查看運(yùn)行中的容器_docker
- 2022-05-12 使用pandas獲取&保存csv或excel的數(shù)據(jù)
- 2022-07-14 Matlab實(shí)現(xiàn)灰色預(yù)測的示例代碼_C 語言
- 2023-01-18 Android?Admob接入原理及完整教程示例_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支