標籤:python函數 順序 就會 實參 nbsp san span style 情況
多個實參,放到一個元組裡面,以*開頭,可以傳多個參數;**是形參中按照關鍵字傳值把多餘的傳值以字典的方式呈現*args:(表示的就是將實參中按照位置傳值,多出來的值都給args,且以元祖的方式呈現)
樣本:
def foo(x, *args): print(x) print(args)foo(1, 2, 3, 4, 5) #其中的2,3,4,5都給了args
執行結果:
1(2, 3, 4, 5)
當args與位置參數和預設參數混用的情況下:(注意三者的順序)
樣本一、(三者順序是:位置參數、預設參數、*args)
def foo(x, y=1, *args): print(x) print(y) print(args) foo(1, 2, 3, 4, 5)#其中的x為1,y=1的值被2重設了,3,4,5都給了args
執行結果是:
12(3, 4, 5)
樣本二、(三者順序是:位置參數、*args、預設參數)
ef foo(x,*args,y=1): print(x) print(args) print(y) foo(1,2,3,4,5)#其中的x為1,2,3,4,5都給了args,y按照預設參數依舊為1
執行結果是:
1(2, 3, 4, 5)1
其中關於*,可以從2個角度來看(需要拆分來看):
1、從形參的角度來看:
樣本:
def foo(*args):#其實這一操作相當於def foo(a,b,c,d,e): print(args)foo(1,2,3,4,5)#其中的1,2,3,4,5都按照位置傳值分別傳給了a,b,c,d,e
執行結果是:
(1, 2, 3, 4, 5)
2、從實參的角度來看:
樣本:
def foo(x,y,z): print(x) print(y) print(z) foo(*(1,2,3))#其中的*(1,2,3)拆開來看就是:foo(1,2,3),都按照位置傳值分別傳給了x,y,z
執行結果是:
123
**kwargs:(表示的就是形參中按照關鍵字傳值把多餘的傳值以字典的方式呈現)
樣本:
def foo(x,**kwargs): print(x) print(kwargs)foo(1,y=1,a=2,b=3,c=4)#將y=1,a=2,b=3,c=4以字典的方式給了kwargs
執行結果是:
1(2, 3, 4){‘y‘: 1, ‘a‘: 2, ‘b‘: 3, ‘c‘: 4}
錯誤樣本:(由於順序錯誤)
ef foo(x,**kwargs,*args): print(x) print(args) print(kwargs)foo(1,y=1,a=2,b=3,c=4,2,3,4)
執行結果就會報錯:
SyntaxError: invalid syntax
位置參數、預設參數、**kwargs三者的順序必須是位置參數、預設參數、**kwargs,不然就會報錯:
樣本:
def foo(x,y=1,**kwargs): print(x) print(y) print(kwargs)foo(1,a=2,b=3,c=4)#將1按照位置傳值給x,y按照預設參數為1,a=2,b=3,c=4以字典的方式給了kwargs
執行結果是:
11{‘a‘: 2, ‘b‘: 3, ‘c‘: 4}
其中關於**,可以從2個角度來看(需要拆分來看):
1、從形參的角度來看:
樣本:
def foo(**kwargs):#其實就是相當於def foo(y,a,b,c) print(kwargs)foo(y=1,a=2,b=3,c=4)
執行結果是:
{‘y‘: 1, ‘a‘: 2, ‘b‘: 3, ‘c‘: 4}
2、從實參的角度來看:
樣本一:
def foo(a,b,c,d): print(a) print(b) print(c) print(d)foo(**{"a":2,"b":3,"c":4,"d":5})#**{"a":2,"b":3,"c":4,"d":5}是將字典裡的每個值按照關鍵字傳值的方式傳給a,b,c,d
執行結果是
2345
樣本二:
def foo(a,b,c,d=1): print(a) print(b) print(c) print(d)foo(**{"a":2,"b":3,"c":4})#**{"a":2,"b":3,"c":4}是將字典裡的每個值按照關鍵字傳值的方式傳給a,b,c;d依舊按照預設參數
執行結果是:
2341
python函數——形參中的:*args和**kwargs