網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
函數(shù)嵌套和嵌套調(diào)用
函數(shù)的嵌套
函數(shù)的嵌套:在函數(shù)里面還有函數(shù)。分為外函數(shù)和內(nèi)函數(shù)。
嵌套函數(shù)是為函數(shù)內(nèi)部服務(wù)的,比如減少代碼的重復(fù),想要調(diào)用函數(shù),要使用函數(shù)名,內(nèi)函數(shù)也一樣。如果不用函數(shù)名調(diào)用內(nèi)函數(shù),內(nèi)函數(shù)就永遠(yuǎn)不會(huì)執(zhí)行。
內(nèi)函數(shù)的調(diào)用
怎么在函數(shù)外部調(diào)用內(nèi)函數(shù)呢?首先,不能直接調(diào)用內(nèi)函數(shù) ,需要先執(zhí)行外函數(shù)的代碼塊。
def func1():
?? ?print("這是外部函數(shù)")
?? ?def func2():
?? ??? ?print("這是內(nèi)部函數(shù)")
func2() ?
沒(méi)有執(zhí)行外函數(shù)內(nèi)部的代碼塊,python找不到內(nèi)函數(shù),所以報(bào)name ‘func2’ is not defined,函數(shù)func2()沒(méi)有定義
有幾種方式可以實(shí)現(xiàn)對(duì)內(nèi)函數(shù)的調(diào)用。
1.在外函數(shù)內(nèi)部調(diào)用內(nèi)函數(shù),即用函數(shù)名調(diào)用
def func1():
?? ?print("這是外部函數(shù)")
?? ?def func2():
?? ??? ?print("這是內(nèi)部函數(shù)")
?? ?func2() #函數(shù)名調(diào)用內(nèi)函數(shù)
func1()?
這樣調(diào)用外函數(shù)也會(huì)執(zhí)行內(nèi)函數(shù)的代碼塊了
2.可以用return調(diào)用內(nèi)函數(shù)
在使用return之前,需要說(shuō)明一點(diǎn):我們都是使用"函數(shù)名()“調(diào)用函數(shù)的方法,單獨(dú)使用"函數(shù)名”,我們會(huì)得到函數(shù)的內(nèi)存地址;(函數(shù)名后面加括號(hào)才會(huì)告訴python,參數(shù)是否對(duì)得上,然后執(zhí)行函數(shù)的代碼塊。)
- "return函數(shù)名()"調(diào)用內(nèi)函數(shù)
def func1():
?? ?print("這是外部函數(shù)")
?? ?def func2():
?? ??? ?print("這是內(nèi)部函數(shù)")
?? ?return func2()
func1()
函數(shù)沒(méi)有返回值,即返回值為None,"return func2()"和"func2()"的效果是一樣的
def func1():
?? ?print("這是外部函數(shù)")
?? ?def func2():
?? ??? ?print("這是內(nèi)部函數(shù)")
?? ?return func2()
m = func1() #調(diào)用函數(shù)func1(),調(diào)用函數(shù)func2的方法
print(m) ? ?#m為None
- 外函數(shù)內(nèi)部"return函數(shù)名",也可以調(diào)用內(nèi)函數(shù),只不過(guò)調(diào)用外函數(shù)時(shí)多加一個(gè)括號(hào)
def func1():
?? ?print("這是外部函數(shù)")
?? ?def func2():
?? ??? ?print("這是內(nèi)部函數(shù)")
?? ?return func2
m = func1()?
print(m)
#?
#執(zhí)行結(jié)果為
這是外部函數(shù)
<function func1.<locals>.func2 at 0x0000000002EB6620>
上面可以看到,使用函數(shù)名得到的是函數(shù)的地址,我們可以用一個(gè)變量指向這個(gè)地址,相當(dāng)于創(chuàng)建一個(gè)變量,這個(gè)變量指向的是函數(shù)的地址。因?yàn)橹挥泻瘮?shù)名是不能調(diào)用函數(shù)的方法的,所以調(diào)用外函數(shù)時(shí)要用到雙括號(hào)。
def func1():
?? ?print("這是外部函數(shù)")
?? ?def func2():
?? ??? ?print("這是內(nèi)部函數(shù)")
?? ?return func2
func1()() ##執(zhí)行func1()會(huì)返回func2然后再func2()
# m = func1()
# m()
我們可以用func1()返回一個(gè)函數(shù)func2,再加一個(gè)括號(hào)調(diào)用內(nèi)函數(shù)的方法。
小結(jié):想要調(diào)用內(nèi)函數(shù),首先要調(diào)用外函數(shù),即執(zhí)行外函數(shù)的代碼塊,才有內(nèi)函數(shù)調(diào)用的環(huán)境。在外函數(shù)內(nèi)部,可以用函數(shù)名調(diào)用內(nèi)函數(shù)。也可以用return調(diào)用內(nèi)函數(shù),如果return是函數(shù)本身的地址,調(diào)用外函數(shù)時(shí)會(huì)用到雙括號(hào),先調(diào)用func1()得到func2然后再func2()。如果return func2(),那么和func2()是一樣的,都是告訴python調(diào)用內(nèi)函數(shù)。
變量的作用范圍
外函數(shù)里面的變量和內(nèi)函數(shù)里面的變量是有區(qū)別的,作用范圍不一樣。內(nèi)函數(shù)也可以使用外函數(shù)的變量,但是如果想要在內(nèi)部函數(shù)修改外部函數(shù)變量的值,就要使用關(guān)鍵字nonlocal
def func1():
?? ?b = 2
?? ?def func2():
?? ??? ?nonlocal b
?? ??? ?b = b - 1
?? ?func2()
?? ?print(b)
函數(shù)的嵌套調(diào)用
在一個(gè)函數(shù)里面調(diào)用別的函數(shù)
def print1():
?? ?print("這是第一個(gè)函數(shù)")
def print2():
?? ?print("這是定義的第二個(gè)函數(shù)")
?? ?print1() #在print2()中調(diào)用print1()
print2()
函數(shù)中定義函數(shù)
在函數(shù)內(nèi)部定義的函數(shù)要在函數(shù)內(nèi)部調(diào)用
def paint():
? ? print("paint")
? ? def paintA():
? ? ? ? print("paintA")
? ? paintA()
paint()
//輸出如下:
//paint
//paintA
在函數(shù)外部調(diào)用函數(shù)的結(jié)果如下
paintA ? ?//試圖在函數(shù)外部調(diào)用paintA()
//以下是報(bào)錯(cuò)信息
---------------------------------------------------------------------------
NameError ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Traceback (most recent call last)
<ipython-input-15-1a59d6e3eeb5> in <module>()
? ? ? 5 ? ? paintA()
? ? ? 6 paint()
----> 7 paintANameError: name 'paintA' is not defined
函數(shù)內(nèi)的函數(shù)可以引用外部變量
但是不可以對(duì)其進(jìn)行修改
a=6
def FuncX(x):
? ? ?def FuncY(y):
? ? ? ? ? ? ?return a*y
? ? ? ? ? ? // return x*y,這里也可以寫(xiě)這條語(yǔ)句進(jìn)行測(cè)試,因?yàn)閷?duì)于FuncY()來(lái)說(shuō),x也算外部變量,我這里主要是為了突出外部變量這個(gè)概念
? ? ?return FuncY
FuncX(5)(6)//把5賦給x,6賦給y
//輸出結(jié)果如下:
36
試圖對(duì)外部變量進(jìn)行修改
a=6
def FuncX(x):
? ? ?def FuncY(y):
? ? ? ? ? ? #global a ? ?加上這條語(yǔ)句即可修改a的值
? ? ? ? ? ? ?a=a*y
? ? ? ? ? ? ?return a ?#試圖修改 a 的值
? ? ? ? ? ?#return a=a*y ? Python不允許返回賦值表達(dá)式,并不是因?yàn)樾薷腶的原因,這里更新一下
? ? ? ? ? ?#更新時(shí)間 ?2019.1.4 ? ? ? ? ? ? ? ?
? ? ?return FuncY
FuncX(5)(6)
//報(bào)錯(cuò)信息
UnboundLocalError: local variable 'a' referenced before assignment
函數(shù)怎么修改外部變量的值的說(shuō)明
對(duì)于全局變量的修改,如果全局變量是int或者str,那么如果想要在函數(shù)中對(duì)函數(shù)變量進(jìn)行修改,則需要先在函數(shù)內(nèi),聲明其為global或nonlocal,在進(jìn)行修改, 如果是list或者dict則可以直接修改
原文鏈接:https://blog.csdn.net/weixin_44851971/article/details/106216497
相關(guān)推薦
- 2022-09-04 使用Python去除小數(shù)點(diǎn)后面多余的0問(wèn)題_python
- 2022-06-25 Android開(kāi)發(fā)MediaCodec和lamemp3多段音頻截取拼接_Android
- 2022-10-04 python中xml格式的轉(zhuǎn)換方法_python
- 2022-06-01 c++深入淺出講解堆排序和堆_C 語(yǔ)言
- 2022-03-14 關(guān)于VS+QT5應(yīng)用程序換圖標(biāo)的解決方案_C 語(yǔ)言
- 2024-03-25 使用HttpURLConnection發(fā)送POST請(qǐng)求并攜帶請(qǐng)求參數(shù)
- 2022-10-14 SpringCloud 微服務(wù)與遠(yuǎn)程調(diào)用測(cè)試
- 2022-10-06 C語(yǔ)言實(shí)現(xiàn)短字符串壓縮的三種方法詳解_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- 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)證過(guò)濾器
- Spring Security概述快速入門(mén)
- 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)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支