默認參數:定義函數的時候給定變量一個默認值。 def num(age=1):
位置參數:調用函數的時候根據定義函數時的形參位置和實參位置進行引用。
關鍵字參數:如果定義的函數中含有關鍵字參數,調用函數時必須要傳如該關鍵字對應的實參。
不定長參數:在定義函數的時候不確定傳入的參數的數量(可能是0個或多個) def num(*args,**args): (不定長參數的標志符號是*和**,args和kwargs只是變量的名字,可以改為任意的變量如(*num,**kwnum))
*+變量名1,可以接受被其他參數接受后剩下的任意的形參(不包括賦值語句),放進一個元組里,這個元組的名字是前面的變量名1(所以位置參數必須在此參數之前)
**+變量名2,可以接受被其他參數接受后剩下的任意賦值語句,放進一個字典中,這個字典的名字是前面的變量名2(所以關鍵字參數和默認參數必須在此參數之前,*+變量名也要在此參數之前)
測試上面的總結是否正確
def num_0(a,b,c,*args,city='beijing',name,**kwnum): print(a,b,c,name,city,args,kwnum) # 輸出的時候直接用*或者** 的變量名 num_0(1,2,3,4,5,6,7,city='hangzhou',name='jack',age=18,country='haidian')
#結果
D:\pycharm_project\裝飾器\venv\Scripts\python.exe D:/pycharm_project/裝飾器/venv/text.py 1 2 3 jack hangzhou (4, 5, 6, 7) {'age': 18, 'country': 'haidian'} Process finished with exit code 0
最后總結
調用函數傳遞實參的時候,先傳變量/定量,再傳賦值語句(num_0(1,2,3,4,5,6,7,city='hangzhou',name='jack',age=18,country='haidian'))
定義函數的時候直接按此順序定義形參(def num_0(a,b,c,*args,city='beijing',name,**kwnum):)(位置參數,*變量名,默認參數,關鍵字參數,**變量名)
接下來討論一下不定長參數中的 * 和 ** 還有什么用處
1,當在函數的形參中使用時(和上面的例子相同)
*t:將所有的其他位置的實參(變量/定量)獲取,並將它們打包到元祖中,並賦值給此形參
def foo(*t): print(t) foo(1,2,3)
(1,2,3)
**t:將所有的其他位置的實參(賦值語句)獲取,並將它們打包到字典中,並賦值給此參數
def foo(**t): print(t) foo(a=1,b=2)
{'x': 1, 'y': 2}
2,當在調用函數的時候使用(實參中)
*tuple_a:將此元祖的元素,當做函數調用的位置參數
def foo(a,b): print(a,b) tuple_a = (1,2) foo(*tuple_a)
1,2
**dict_a:將字典中的鍵值對,當做函數調用的關鍵字參數
def foo(x, y): print(x, y) dict_a = {'x':1, 'y':2} foo(**dict_a)
1,2
3,在匹配和for循環中
*x意味着‘匹配多余的元素’,x是一個列表
>>>x, *xs = (1, 2, 3, 4) >>>xs [2, 3, 4]
>>>x, *xs = [1, 2, 3, 4] >>>xs [2, 3, 4]
>>> *xs, x = (1, 2, 3, 4)
>>> xs
[1, 2, 3]
>>> x
4
>>> x, *xs, y = (1, 2, 3, 4)
>>> x
1
>>> xs
[2, 3]
>>> y
4
for (x, *y, z) in [ (1, 2, 3, 4) ]: print(x, y, z) 1 [2, 3] 4
4,可以用於合並字典
dict_a = {'a':1,'b':2} dict_b = {'b':3,'c':4} dict_c = {**dict_a,**dict_b} print(dict_c)
{'a': 1, 'b': 3, 'c': 4}
*t 表示“獲取此函數的所有其他位置參數,並將它們作為元組打包到此參數中