python定義函式時的引數&呼叫函式時的傳參
阿新 • • 發佈:2019-01-05
一、定義函式:
1、位置引數:直接定義引數
2、預設引數(或者關鍵字引數):引數名 = "預設值"
3、位置引數必須在預設引數之前
二、呼叫函式:
1、按位置傳,直接寫引數的值
2、按關鍵字傳,關鍵字 = "值"
3、位置引數必須在關鍵字引數之前
4、關鍵字引數可在*args和**kwargs之前
注:呼叫時,無論定義的函式是使用位置引數還是預設值引數,呼叫函式時,都可以按位置傳參或者按關鍵字進行傳參,即呼叫時的傳參形式和定義時的引數形式無關
def foo(a, b, c=3): print("a={},b={},c={}".format(a, b, c)) foo(1,2,3) # 呼叫函式時按位置引數進行傳參 # 輸出 a=1,b=2,c=3 foo(a=1,b=2,c=3) # 呼叫函式時按關鍵字引數傳參 foo(c=3,a=1,b=2) # 使用關鍵字傳參時,與關鍵字的位置無關,即關鍵字引數之間不存在先後順序 # 上面呼叫的結果是一樣的 def foo(a, b, name=None,*args, **kwargs): print(name) print(args) print(kwargs) A=(1, 2, 3) B={"k1":"v1","k2":"v2"} foo(1,2,C=6,*A,**B) #如果寫成foo(1,2,C=6,1, 2, 3,**B)則會報錯 1------->name (2, 3)------->args {'k2': 'v2', 'C': 6, 'k1': 'v1'}------->kwargs,C=6傳入kwargs中
三、動態引數
定義函式時:
動態位置引數使用*args進行定義(引數前加一個*),將所有的值進行聚合成一個元組
動態關鍵字引數使用**kwargs進行定義(引數前加二個*),將所有的值進行聚合成一個字典
呼叫函式時:
1、使用位置引數和關鍵字引數進行傳參
2、給一個序列加上*,就是將這個序列進行解包,然後按位置進行傳參
3、給一個欄位加上**,就是將這個字典進行解包,然後按關鍵字引數進行傳參
def foo(*args): print(args) foo(*[1,2,3]) #輸出 (1, 2, 3) def foo(**kwargs): print(kwargs) foo(**{"a":1,"b":2}) # 輸出 {'a': 1, 'b': 2}
四、預設引數和可變引數混合使用
1、預設引數定義在可變引數之前
def foo(x,y = 1,*args): print(x) print(y) print(args) foo(1,2,3,4,5,6,7,8,9) #呼叫函式,改變預設引數的值 1------->x=1 2-------->y=2 (3, 4, 5, 6, 7, 8, 9)----->args的值變成元組
2、預設引數定義在可變引數之後
def foo(x,*args,y = 1000): print(x) print(y) print(args) foo(1,2,3,4,5,6,7,8,9) #呼叫函式,使用預設值 1------->x=1 2-------->y=1000 (2, 3, 4, 5, 6, 7, 8, 9)----->args的值變成元組 foo(1,2,3,4,5,6,7,8,y=2000) #呼叫函式,改變預設值 1------->x=1 2-------->y=2000 (2, 3, 4, 5, 6, 7, 8)----->args的值變成元組
五、複雜混合引數
#使用預設引數時,注意預設引數的位置要在args之後kwargs之前 def foo(x,*args,a=4,**kwargs): print(x) print(a) print(args) print(kwargs) foo(1,5,6,7,8,y=2,z=3) #呼叫函式,不修改預設引數 1------->x=1 4------->a=4 (5, 6, 7, 8)------->args {'y': 2, 'z': 3}------->kwargs
#注意:當需要修改預設引數時,要調整預設引數的位置,要放在args之前即可,但不可放在開頭 def foo(x,a=4,*args,**kwargs): print(x) print(a) print(args) print(kwargs) foo(1,9,5,6,7,8,y=2,z=3) #呼叫函式,修改預設引數a為9 1------->x=1 9------->a=9 (5, 6, 7, 8)------->args {'y': 2, 'z': 3}------->kwargs
六、總結
定義函式時引數順序:
1、位置引數--->預設引數--->可變位置引數--->可變關鍵字引數(呼叫時修改預設引數)
2、位置引數--->可變位置引數--->預設引數--->可變關鍵字引數((呼叫時可不修改預設引數)
呼叫函式順序:
1、位置引數在關鍵引數之前,呼叫時的傳參形式和定義時的引數形式無關
2、位置引數在最前,可變位置引數傳參和關鍵字引數傳參沒有先後之分,可變關鍵字引數最後
def foo(a, b, *args, name=None,* *kwargs): print(name) print(args) print(kwargs) A=(1, 2, 3) B={"k1":"v1","k2":"v2"} foo(1,2,C=6,*A,**B) #關鍵字在可變位置引數之前 # None------->name # (2, 3)------->args # {'k2': 'v2', 'C': 6, 'k1': 'v1'}------->kwargs,C=6傳入kwargs中 foo(1,2,*A,C=6,**B) #關鍵字在可變位置引數之後,輸出結果和上面一致 foo(1,2,*A,**B,C=6) #SyntaxError: invalid syntax,語法錯誤