摘要:定義函數(shù)中的函數(shù)使用關(guān)鍵字定義,格式為函數(shù)名形參函數(shù)語(yǔ)句塊函數(shù)名只能包含字符串下劃線和數(shù)字且不能以數(shù)字開頭。所以默認(rèn)參數(shù)還是放在后面合適。
定義函數(shù)
python中的函數(shù)使用關(guān)鍵字 def 定義,格式為:
def 函數(shù)名(形參): 函數(shù)語(yǔ)句塊
函數(shù)名只能包含字符串、下劃線和數(shù)字且不能以數(shù)字開頭。
函數(shù)的形參分為:位置參數(shù)、默認(rèn)參數(shù)(自帶默認(rèn)值的參數(shù))、動(dòng)態(tài)參數(shù)
return是關(guān)鍵字,作用是返回函數(shù)的結(jié)果,遇到return時(shí)函數(shù)立刻結(jié)束,不再執(zhí)行其他語(yǔ)句
def func(a,b): return a,b print(func(1,2)) #按照位置傳入?yún)?shù),1賦值給a,2賦值給b print(func(a=2,b=3))#按照關(guān)鍵字傳入?yún)?shù),指定a、b的值 print(func(3,b=6))#混合傳入,此時(shí)注意,位置參數(shù)要在前面 #如果不指定實(shí)參會(huì)報(bào)錯(cuò),因?yàn)楹瘮?shù)中由位置參數(shù),則調(diào)用函數(shù)時(shí)必須傳入?yún)?shù) #print(func())
輸出結(jié)果為:
(1, 2) (2, 3) (3, 6)
不寫return或者只寫return,后面不寫其他內(nèi)容時(shí),函數(shù)會(huì)返回None
return可以返回任意數(shù)據(jù)類型的值。當(dāng)return返回多個(gè)值時(shí),會(huì)被組織成元組,也就是說返回多個(gè)值時(shí),類型為元組??梢杂枚鄠€(gè)變量接收結(jié)果,但變量的數(shù)量要與返回的值數(shù)量相同,示例如下:
def func(): return 1,"asd",(1,"a",["hello","world"]),[1,2,3] print("直接打印結(jié)果:",func()) a,b,c,d = func() print("a:",a) print("b:",b) print("c:",c) print("d:",d)
輸出:
直接打印結(jié)果: (1, "asd", (1, "a", ["hello", "world"]), [1, 2, 3]) a: 1 b: asd c: (1, "a", ["hello", "world"]) d: [1, 2, 3]默認(rèn)參數(shù)
def func(name,age=20): print("{}已經(jīng){}歲啦".format(name,age)) func("劉小姐")#默認(rèn)參數(shù)可以不傳,這時(shí)age值為默認(rèn)的20 func("劉小姐",28)#默認(rèn)參數(shù)傳值時(shí)則覆蓋默認(rèn)值
劉小姐已經(jīng)20歲啦 劉小姐已經(jīng)28歲啦
默認(rèn)值只被賦值一次。這使得當(dāng)默認(rèn)值是可變對(duì)象時(shí)會(huì)有所不同,比如列表、字典或者大多數(shù)類的實(shí)例。例如,下面的函數(shù)在后續(xù)調(diào)用過程中會(huì)累積(前面)傳給它的參數(shù):
def func(a = []): a.append("x") return a for i in range(6): print(func())
每次循環(huán)調(diào)用的時(shí)候,雖然沒有給a傳入?yún)?shù),但是a并不會(huì)被賦值空列表[],原因是默認(rèn)值只會(huì)被賦值一次,所以輸出結(jié)果變成了下面的樣子:
["x"] ["x", "x"] ["x", "x", "x"] ["x", "x", "x", "x"] ["x", "x", "x", "x", "x"] ["x", "x", "x", "x", "x", "x"]
如果你不想讓默認(rèn)值在后續(xù)調(diào)用中累積,你可以像下面一樣定義函數(shù):
def func(a = None): if a is None: #如果a是None a = [] a.append("x") return a for i in range(6): print(func())
["x"] ["x"] ["x"] ["x"] ["x"] ["x"]動(dòng)態(tài)參數(shù)
動(dòng)態(tài)參數(shù)分為兩種:
一種是用*args表示,它會(huì)把多余的位置參數(shù)統(tǒng)一接收,保存成一個(gè)元組的形式
另一種是用**kwargs表示,他會(huì)把多余的關(guān)鍵字參數(shù)統(tǒng)一接收,保存成一個(gè)字典的形式
先看一個(gè)*args的例子
def func(a,b,c,*args): print("*args內(nèi)容為:",args) sum1 = 0 for i in args: sum1 += i sum1 = sum1 + a +b +c return sum1 print(func(1,2,3,4,5,6,7,8,9,10))
雖然形參只有4個(gè),但是我們傳入了10個(gè),4—10 都被*args接收形成元組
*args內(nèi)容為: (4, 5, 6, 7, 8, 9, 10) 55
再來看看**kwargs
def func(a,b,*args,c=20,**kwargs): print("*args內(nèi)容為:",args) print(c) print("**kwargs內(nèi)容為:",kwargs) sum1 = 0 for i in args: sum1 += i sum1 = sum1 + a +b +c for k in kwargs: sum1 += kwargs[k] return sum1 print(func(1,2,3,4,5,6,7,8,9,10,c=22,x=11,y=33,z=66))
*args內(nèi)容為: (3, 4, 5, 6, 7, 8, 9, 10) 22 **kwargs內(nèi)容為: {"x": 11, "y": 33, "z": 66} 187
從上例可以看出如果各種類型的形參都出現(xiàn)時(shí),它們的順序應(yīng)該是:位置參數(shù)、動(dòng)態(tài)參數(shù)args、默認(rèn)參數(shù)、動(dòng)態(tài)參數(shù)*keargs
因?yàn)榧僭O(shè)默認(rèn)參數(shù)在 args之前,也就是func(a,b,c=20,args,*kwargs),那么傳入?yún)?shù)時(shí),形參c的值先會(huì)被實(shí)參3賦值(因?yàn)?的位置恰好對(duì)應(yīng)c,默認(rèn)參數(shù)不賦值時(shí)值為默認(rèn),賦值時(shí)則覆蓋默認(rèn)值),此時(shí)c=3,但是后面又出現(xiàn)了c=20,這時(shí)就會(huì)報(bào)錯(cuò),因?yàn)樾螀被重復(fù)賦值了兩次,這是不允許的 所以默認(rèn)參數(shù)排在 args后面
默認(rèn)參數(shù)必須排在kwargs前面,因?yàn)槿绻旁诤竺?,則c=22會(huì)被kwargs直接接收,這樣默認(rèn)參數(shù)毫無(wú)意義,這是不被允許的,會(huì)報(bào)錯(cuò)
下面是默認(rèn)參數(shù)排在*args前面的另一種方式,這種方式雖然也得出了相同的結(jié)果但是在調(diào)用時(shí)要特別的小心c的值所在的位置,
而且這種方式會(huì)造成默認(rèn)參數(shù)變得毫無(wú)意義,因?yàn)槭冀K用不到默認(rèn)值20。
所以默認(rèn)參數(shù)還是放在*args后面合適。
def func(a,b,c=20,*args,**kwargs): print("*args內(nèi)容為:",args) print(c) print("**kwargs內(nèi)容為:",kwargs) sum1 = 0 for i in args: sum1 += i sum1 = sum1 + a +b +c for k in kwargs: sum1 += kwargs[k] return sum1 print(func(1,2,22,3,4,5,6,7,8,9,10,x=11,y=33,z=66))
*args內(nèi)容為: (3, 4, 5, 6, 7, 8, 9, 10) 22 **kwargs內(nèi)容為: {"x": 11, "y": 33, "z": 66} 187動(dòng)態(tài)參數(shù)的一種快捷傳參方式
對(duì)于*args,可以在傳入?yún)?shù)時(shí)在lis前面加*號(hào) 直接傳入內(nèi)容
def func(*args): return args lis = [1,2,{3,4,5},6,7,[8,9,0,1,23],34,5,(56,67),78,23] print(type(lis)) print(func(*lis))
(1, 2, {3, 4, 5}, 6, 7, [8, 9, 0, 1, 23], 34, 5, (56, 67), 78, 23)
對(duì)于**kwargs可以在傳入?yún)?shù)時(shí)在dic前面加**號(hào) 直接傳入內(nèi)容
def func(**kwargs): return kwargs dic = {"name":"超人","age":"500","job":"裝逼"} print(func(**dic))
{"name": "超人", "age": "500", "job": "裝逼"}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42551.html
摘要:我們說觸發(fā)了閉包的函數(shù)叫做閉包函數(shù)閉包最大的特點(diǎn)就是它可以被外層函數(shù)返回后賦值給一個(gè)變量,并且攜帶了外層函數(shù)內(nèi)定義的變量例子如下變量為函數(shù)開辟的局部命名空間內(nèi)定義的變量函數(shù)內(nèi)引用了變量的內(nèi)層函數(shù)名被當(dāng)作返回值,此時(shí)閉包規(guī)則達(dá)成。 什么是閉包? 其實(shí)我們?cè)谑褂煤瘮?shù)過程中不經(jīng)意間就會(huì)觸發(fā)閉包,因?yàn)榭倳?huì)出于某種原因會(huì)在函數(shù)內(nèi)引用或修改上一層函數(shù)的變量,這時(shí)就會(huì)觸發(fā)閉包 那么什么是閉包?其實(shí)就...
摘要:在內(nèi)置命名空間不能使用全局和局部的名字。可以形象地理解成內(nèi)置命名空間具有最高級(jí)別,不需要定義就可以使用,全局命名空間次之,最低級(jí)是局部命名空間。 python中的命名空間分三種: 內(nèi)置的命名空間,在啟動(dòng)解釋器的時(shí)候自動(dòng)加載進(jìn)內(nèi)存的各種名字所在的空間,比如print,input等不需要定義就可以使用的名字 全局命名空間,就是從上到下所有我們定義的變量名和函數(shù)名所在的空間,是在程序從上到下...
摘要:事實(shí)上語(yǔ)言當(dāng)中有的內(nèi)容,比如函數(shù)循環(huán)結(jié)構(gòu)體宏等等內(nèi)容,也都有,所以大家千萬(wàn)不要認(rèn)為語(yǔ)言白學(xué)了哈因?yàn)橹耙呀?jīng)完整更新過語(yǔ)言的博客有需要可以往前翻,所以這里直接介紹相對(duì)語(yǔ)言當(dāng)中新增的內(nèi)容,而本章引入的內(nèi)容是的關(guān)鍵字命名空間缺省參數(shù)函數(shù)重載。 ...
摘要:當(dāng)集合為空時(shí),稱該二叉樹為空二叉樹。也就是說,如果一個(gè)二叉樹的層數(shù)為,且結(jié)點(diǎn)總數(shù)是,則它就是滿二叉樹。完全二叉樹完全二叉樹是效率很高的數(shù)據(jù)結(jié)構(gòu),完全二叉樹是由滿二叉樹而引出來的。 ...
閱讀 3202·2023-04-26 01:39
閱讀 3354·2023-04-25 18:09
閱讀 1623·2021-10-08 10:05
閱讀 3241·2021-09-22 15:45
閱讀 2790·2019-08-30 15:55
閱讀 2402·2019-08-30 15:54
閱讀 3173·2019-08-30 15:53
閱讀 1335·2019-08-29 12:32