這篇文章主要介紹“Python函數(shù)的返回值與嵌套函數(shù)是什么”,在日常操作中,相信很多人在Python函數(shù)的返回值與嵌套函數(shù)是什么問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Python函數(shù)的返回值與嵌套函數(shù)是什么”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
成都創(chuàng)新互聯(lián)公司主營(yíng)連云網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營(yíng)網(wǎng)站建設(shè)方案,成都App定制開發(fā),連云h5小程序開發(fā)搭建,連云網(wǎng)站營(yíng)銷推廣歡迎連云等地區(qū)企業(yè)咨詢
返回值指的是函數(shù)返回的結(jié)果;
return執(zhí)行完畢后面的語(yǔ)句將不會(huì)再執(zhí)行;
def add(x, y): print(x, y) #輸出:10 20 return x + y # 返回值, return以后的語(yǔ)句將不會(huì)再執(zhí)行 print(x) print(y) add(10,20)
如果一個(gè)函數(shù)里面有兩個(gè)return,前面return執(zhí)行完畢,后面的return也不會(huì)執(zhí)行;
def add(x, y): print(x, y) # 輸出:1 2 return x + y # 函數(shù)體內(nèi),碰到return語(yǔ)句,函數(shù)執(zhí)行完畢,之后的語(yǔ)句將不會(huì)再執(zhí)行 return x - y # 不會(huì)再次執(zhí)行 add(1,2)
Python函數(shù)都有返回值,如果有return語(yǔ)句,是顯式返回;
如果沒有return語(yǔ)句,默認(rèn)返回None,是隱式返回;
如果返回多個(gè)值通過逗號(hào)分開,會(huì)把值進(jìn)行壓縮,封裝成一個(gè)元組;
def get_data(x,y,z): return x + 1, y + 1, z + 1 print(get_data(1,2,3)) # 得到的是一個(gè)元組(2, 3, 4)
如果返回一個(gè)列表,得到的就是一個(gè)列表;
def get_data(x,y,z): return [x + 1, y + 1, z + 1] print(get_data(1,2,3)) # 得到的是一個(gè)列表[2, 3, 4]
def outer_function(): # 內(nèi)部函數(shù) def inner_function(): print("inner_function") # 輸出:inner_function print("outer_function") # 輸出:outer_function # 內(nèi)部調(diào)用 inner_function() outer_function() # 注意:inner_function函數(shù)只能在outer_function函數(shù)內(nèi)部調(diào)用,無法再outer_function函數(shù)外部被調(diào)用
嵌套函數(shù)的內(nèi)部函數(shù)只能在包含它的函數(shù)的直接父級(jí)調(diào)用,也就是只能在包含它的外部函數(shù)中調(diào)用;
嵌套函數(shù)層數(shù)不宜過深,一般3層以內(nèi)即可,太深不夠直觀,容易造成代碼混亂;
作用域指的是,一個(gè)標(biāo)識(shí)符的作用范圍就是這個(gè)標(biāo)識(shí)符的作用域;
在函數(shù)里面定義的變量(即局部作用域)只能在函數(shù)體內(nèi)部被訪問,函數(shù)外部不能訪問;
def add(x, y): z = 100 print(x, y , z) #輸出:1 2 100 add(1,2) print(z) #報(bào)錯(cuò):NameError: name 'z' is not defined
在函數(shù)外部定義的變量(即全局作用域)能在函數(shù)體外部被訪問,也能在函數(shù)體內(nèi)部被訪問;
z = 100 def add(x, y): print(x, y, z)# 輸出:1 2 100 add(1, 2) print(z) # 輸出:100
閉包:內(nèi)部函數(shù)引用了外部函數(shù)的變量,這就是閉包的定義;
如果函數(shù)體想訪問變量,只能在變量定義之后才能訪問;
# 例1 x=5 def add(): y = x + 1 print(y) #輸出:6 add() # 例2 x=5 def add(): x = x + 1 # 報(bào)錯(cuò):local variable 'x' referenced before assignment add() # 報(bào)錯(cuò)原因分析: # 在例1中,函數(shù)內(nèi)部引用的x為函數(shù)外部的x, 因此x的值為5 # 在例2中,函數(shù)內(nèi)部重新定義了x的值,那么整個(gè)函數(shù)內(nèi)部都會(huì)使用這個(gè)內(nèi)部x, # 因此在運(yùn)算x + 1的時(shí)候,x還沒有完成定義就被引用了,這里的x引用的一定是內(nèi)部正在定義的 x,不是函數(shù)外部的 x=5這個(gè)x; # 例3: x=5 def add(): print(x) # 這里的x引用的是x = 1的x,但是執(zhí)行print(x)時(shí),x還沒有被定義,所以報(bào)錯(cuò):local variable 'x' referenced before assignment x = 1 add()
如果要訪問函數(shù)體內(nèi)部的函數(shù),可以先把內(nèi)部函數(shù)的函數(shù)名作為外部函數(shù)的返回值,把外部函數(shù)的引用賦值給變量,再調(diào)用變量;
# 例4: def outer_function(): x = 100 def inner_function(): print(x) # 內(nèi)部函數(shù)引用了外部函數(shù)的自由變量 輸出:100 return inner_function ret = outer_function() ret()
global關(guān)鍵字:可以指定變量為全局變量,但是global關(guān)鍵字會(huì)污染全局變量,也就是會(huì)覆蓋之前全局變量的值,所以最好慎用;
x=1 def add(): global x # 使用global關(guān)鍵字,指定x的引用全局的x變量 x = x + 1 print(x) #輸出:2 add() x = 100 def foo(): global x # x被聲明了全局變量 x = 10 x += 1 print(x) # x的值為11 foo() print(x) # 輸出x的值為:11,原本這里應(yīng)該引用的是全局變量x = 100 的,因此global關(guān)鍵字污染了全局變量 x
nonlocal關(guān)鍵字:可以申明內(nèi)部函數(shù)的變量引用的是外部函數(shù)變量的值(作用域在外部函數(shù)),不是全局作用域的值,因此不會(huì)污染全局作用域;
def outer_function(): x = 100 def inner_function(): x = x + 1 # 這樣會(huì)報(bào)錯(cuò),函數(shù)內(nèi)部重新定義了x的值,但是還沒有完成定義就被引用了 print(x) return inner_function ret = outer_function() ret() def outer_function(): x = 1 def inner_function(): nonlocal x # 使用nonlocal關(guān)鍵字聲明x 為外層函數(shù)的x的值 x = x + 1 #所以這里使用的x 是外層函數(shù)的x print(x) #輸出:2 return inner_function ret = outer_function() ret()
同一個(gè)函數(shù)的生命周期相同,函數(shù)的默認(rèn)值會(huì)綁定在函數(shù)的整個(gè)生命周期上,不會(huì)因?yàn)楹瘮?shù)內(nèi)部對(duì)默認(rèn)值的操作而發(fā)生改變;
def add(lst = []): lst.append('hello') print(lst) add() # 輸出:['hello'] print('id={}'.format(id(add))) # 函數(shù)對(duì)象的id值不變,調(diào)用的是同一個(gè)函數(shù) id=1837000 add() # 輸出['hello', 'hello'] print('id={}'.format(id(add))) # 函數(shù)對(duì)象的id值不變,調(diào)用的是同一個(gè)函數(shù) id=1837000 # 查看函數(shù)的位置參數(shù)的默認(rèn)值 print(add.__defaults__) #輸出:(['hello', 'hello'],) # 查看函數(shù)的關(guān)鍵字參數(shù)的默認(rèn)值 print(add.__kwdefaults__) #輸出:None
可以使用淺拷貝copy(簡(jiǎn)寫[:])來清空默認(rèn)值,那每次調(diào)用函數(shù),默認(rèn)值都為初始值;
def add(lst = []): lst = lst[:] lst.append('hello') print(lst) add() # 輸出:['hello'] add() # 輸出:['hello']
也可以通過參數(shù)值判斷來給默認(rèn)值重新賦值,那每次調(diào)用函數(shù),默認(rèn)值都為初始值;
def add(lst=None): if lst is None: lst = [] lst.append(1) print(lst) add() # 輸出:[1] print(add.__defaults__) # 輸出: (None,) add([1, 2, 3]) # 輸出: [1, 2, 3, 1] print(add.__defaults__) # 輸出:(None,) add([4, 5, 6]) # 輸出:[4, 5, 6, 1] print(add.__defaults__) # 輸出:(None,)
def add(): print('add') del add add()
可以通過 del 函數(shù)名 的方式來刪除函數(shù),再調(diào)用函數(shù)時(shí),就會(huì)報(bào)錯(cuò)不存在;
到此,關(guān)于“Python函數(shù)的返回值與嵌套函數(shù)是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!