摘要:定義函數中的函數使用關鍵字定義,格式為函數名形參函數語句塊函數名只能包含字符串下劃線和數字且不能以數字開頭。所以默認參數還是放在后面合適。
定義函數
python中的函數使用關鍵字 def 定義,格式為:
def 函數名(形參): 函數語句塊
函數名只能包含字符串、下劃線和數字且不能以數字開頭。
函數的形參分為:位置參數、默認參數(自帶默認值的參數)、動態參數
return是關鍵字,作用是返回函數的結果,遇到return時函數立刻結束,不再執行其他語句
def func(a,b): return a,b print(func(1,2)) #按照位置傳入參數,1賦值給a,2賦值給b print(func(a=2,b=3))#按照關鍵字傳入參數,指定a、b的值 print(func(3,b=6))#混合傳入,此時注意,位置參數要在前面 #如果不指定實參會報錯,因為函數中由位置參數,則調用函數時必須傳入參數 #print(func())
輸出結果為:
(1, 2) (2, 3) (3, 6)
不寫return或者只寫return,后面不寫其他內容時,函數會返回None
return可以返回任意數據類型的值。當return返回多個值時,會被組織成元組,也就是說返回多個值時,類型為元組。可以用多個變量接收結果,但變量的數量要與返回的值數量相同,示例如下:
def func(): return 1,"asd",(1,"a",["hello","world"]),[1,2,3] print("直接打印結果:",func()) a,b,c,d = func() print("a:",a) print("b:",b) print("c:",c) print("d:",d)
輸出:
直接打印結果: (1, "asd", (1, "a", ["hello", "world"]), [1, 2, 3]) a: 1 b: asd c: (1, "a", ["hello", "world"]) d: [1, 2, 3]默認參數
def func(name,age=20): print("{}已經{}歲啦".format(name,age)) func("劉小姐")#默認參數可以不傳,這時age值為默認的20 func("劉小姐",28)#默認參數傳值時則覆蓋默認值
劉小姐已經20歲啦 劉小姐已經28歲啦
默認值只被賦值一次。這使得當默認值是可變對象時會有所不同,比如列表、字典或者大多數類的實例。例如,下面的函數在后續調用過程中會累積(前面)傳給它的參數:
def func(a = []): a.append("x") return a for i in range(6): print(func())
每次循環調用的時候,雖然沒有給a傳入參數,但是a并不會被賦值空列表[],原因是默認值只會被賦值一次,所以輸出結果變成了下面的樣子:
["x"] ["x", "x"] ["x", "x", "x"] ["x", "x", "x", "x"] ["x", "x", "x", "x", "x"] ["x", "x", "x", "x", "x", "x"]
如果你不想讓默認值在后續調用中累積,你可以像下面一樣定義函數:
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"]動態參數
動態參數分為兩種:
一種是用*args表示,它會把多余的位置參數統一接收,保存成一個元組的形式
另一種是用**kwargs表示,他會把多余的關鍵字參數統一接收,保存成一個字典的形式
先看一個*args的例子
def func(a,b,c,*args): print("*args內容為:",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個,但是我們傳入了10個,4—10 都被*args接收形成元組
*args內容為: (4, 5, 6, 7, 8, 9, 10) 55
再來看看**kwargs
def func(a,b,*args,c=20,**kwargs): print("*args內容為:",args) print(c) print("**kwargs內容為:",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內容為: (3, 4, 5, 6, 7, 8, 9, 10) 22 **kwargs內容為: {"x": 11, "y": 33, "z": 66} 187
從上例可以看出如果各種類型的形參都出現時,它們的順序應該是:位置參數、動態參數args、默認參數、動態參數*keargs
因為假設默認參數在 args之前,也就是func(a,b,c=20,args,*kwargs),那么傳入參數時,形參c的值先會被實參3賦值(因為3的位置恰好對應c,默認參數不賦值時值為默認,賦值時則覆蓋默認值),此時c=3,但是后面又出現了c=20,這時就會報錯,因為形參c被重復賦值了兩次,這是不允許的 所以默認參數排在 args后面
默認參數必須排在kwargs前面,因為如果排在后面,則c=22會被kwargs直接接收,這樣默認參數毫無意義,這是不被允許的,會報錯
下面是默認參數排在*args前面的另一種方式,這種方式雖然也得出了相同的結果但是在調用時要特別的小心c的值所在的位置,
而且這種方式會造成默認參數變得毫無意義,因為始終用不到默認值20。
所以默認參數還是放在*args后面合適。
def func(a,b,c=20,*args,**kwargs): print("*args內容為:",args) print(c) print("**kwargs內容為:",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內容為: (3, 4, 5, 6, 7, 8, 9, 10) 22 **kwargs內容為: {"x": 11, "y": 33, "z": 66} 187動態參數的一種快捷傳參方式
對于*args,可以在傳入參數時在lis前面加*號 直接傳入內容
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)
對于**kwargs可以在傳入參數時在dic前面加**號 直接傳入內容
def func(**kwargs): return kwargs dic = {"name":"超人","age":"500","job":"裝逼"} print(func(**dic))
{"name": "超人", "age": "500", "job": "裝逼"}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42551.html
摘要:我們說觸發了閉包的函數叫做閉包函數閉包最大的特點就是它可以被外層函數返回后賦值給一個變量,并且攜帶了外層函數內定義的變量例子如下變量為函數開辟的局部命名空間內定義的變量函數內引用了變量的內層函數名被當作返回值,此時閉包規則達成。 什么是閉包? 其實我們在使用函數過程中不經意間就會觸發閉包,因為總會出于某種原因會在函數內引用或修改上一層函數的變量,這時就會觸發閉包 那么什么是閉包?其實就...
摘要:在內置命名空間不能使用全局和局部的名字。可以形象地理解成內置命名空間具有最高級別,不需要定義就可以使用,全局命名空間次之,最低級是局部命名空間。 python中的命名空間分三種: 內置的命名空間,在啟動解釋器的時候自動加載進內存的各種名字所在的空間,比如print,input等不需要定義就可以使用的名字 全局命名空間,就是從上到下所有我們定義的變量名和函數名所在的空間,是在程序從上到下...
摘要:事實上語言當中有的內容,比如函數循環結構體宏等等內容,也都有,所以大家千萬不要認為語言白學了哈因為之前已經完整更新過語言的博客有需要可以往前翻,所以這里直接介紹相對語言當中新增的內容,而本章引入的內容是的關鍵字命名空間缺省參數函數重載。 ...
摘要:當集合為空時,稱該二叉樹為空二叉樹。也就是說,如果一個二叉樹的層數為,且結點總數是,則它就是滿二叉樹。完全二叉樹完全二叉樹是效率很高的數據結構,完全二叉樹是由滿二叉樹而引出來的。 ...
閱讀 3192·2023-04-26 01:39
閱讀 3345·2023-04-25 18:09
閱讀 1612·2021-10-08 10:05
閱讀 3228·2021-09-22 15:45
閱讀 2758·2019-08-30 15:55
閱讀 2393·2019-08-30 15:54
閱讀 3167·2019-08-30 15:53
閱讀 1324·2019-08-29 12:32