python中函數的參數
形參:定義函數時代表函數的形式參數
實參:調用函數時傳入的實際參數
列如:
def f(x,y): # x,y形參 print(x, y) f(1, 2) # 1, 2 實參
定義函數時,形參分為普通參數,默認參數,和動態參數
列如:
def f(x, y): # 普通參數 pass def f(x, y=1): # y=1是默認參數 pass def(x,y=1,*args): # *args普通動態參數 pass def(x,y=1,**kwargs): # **kwargs關鍵字動態參數 pass
調用函數時,根據調用時的寫法,可以分為位置參數和關鍵字參數
def f(x,y): print('x=',x,'y'=,y) f(1,2) #我們這樣調用的時候1,2叫位置參數,會根據傳入的實參 #位置去對於形參的位置 輸出結果為: x= 1 y= 2 f(x=1, y=2) f(y=2, x=1) #我們這樣調用的時候,y=2,x=1叫做關鍵字參數 #可以不用按照位置寫
那調用的時候同時寫位置參數和關鍵字參數呢
還是以上面的f函數為例
f(x=1, 2) # 當我們吧關鍵字參數放前面 執行結果如下: File "F:/python/tt.py", line 9 f(x=1, 2) SyntaxError: non-keyword arg after keyword arg
得出結論:關鍵字參數不能放在位置參數前面,這個是語法規定
f(1, x=2) 執行結果: Traceback (most recent call last): File "F:/python/tt.py", line 9, in <module> f(1, x=2) TypeError: f() got multiple values for keyword argument 'x'
得出結論:如果位置參數和關鍵字參數需要同時匹配
那么根據這兩條,我們還可以總結出定義函數時的規范:
1.默認參數要寫在普通參數的后面
2.關鍵字動態參數**kwargs要寫在最后面
我們再來看看動態參數是怎么運行的:
普通動態參數:
def f(x, *args): print(args) f(1, 2, '3', [1, 2, 3]) f(3, 2, [1, 2, 3]) 運行結果: (2, '3', [1, 2, 3]) (2, [1, 2, 3])
普通動態參數會將傳入的所有多余的位置參數組合成一個元祖
關鍵字動態參數:
def f(x, y=1, **kwargs): print(kwargs) f(1, 2, z=2, a=3, d=4) f(3, 2, xx=2, name='xinlan', age=18) 運行結果: {'a': 3, 'z': 2, 'd': 4} {'age': 18, 'xx': 2, 'name': 'xinlan'}
關鍵字動態參數會將傳入的多余的關鍵字參數組合成一個字典
案例:
d = { 'name': 'xinlan', 'age': 18 } def f(**kwargs): print(kwargs) f(**d) f(name='xinlan', age=18) 運行結果: {'name': 'xinlan', 'age': 18} {'name': 'xinlan', 'age': 18}
結論:將一個字典前加上**傳入一個函數,相當於將這個字典中的鍵值對以關鍵字參數的形式傳入函數。
案例:
l = ['python', 'php', 'java'] def f(*args): print(args) f(*l) f('python', 'php', 'java') 運行結果: ('python', 'php', 'java') ('python', 'php', 'java')
結論:將一個列表前加上*傳入一個函數,相當於將這個列表中的元素按順序傳入函數
默認參數
默認參數的作用就是,如果我們在調用函數的時候不傳入相應的參數,那么函數就用默認值
在定義函數的時候我們容易出現一個錯誤,看下面的例子:
def f(y=[]): y.append('ok') print(y) f() f() 執行結果: ['ok'] ['ok', 'ok']
我們調用了兩次f函數,發現輸出的結果不一樣。這是因為列表,字典等這樣的數據類型在調用的時候是引用它們的地址。
解釋器在執行y=[]的時候,y指向的一個列表的引用地址,這個列表發生變化后,y指向的地址是沒有變的
所以我們在定義函數的時候,默認參數不要定義成列表,字典等數據類型。當然我們有解決辦法:
def f(y=None): # 這里None是一個占位符 if not y: y = [] y.append('ok') print(y) f() f() 執行結果 ['ok'] ['ok']