*args:(表示的就是將實參中按照位置傳值,多出來的值都給args,且以元祖的方式呈現)python
示例:spa
def foo(x,*args):
print(x)
print(args)
foo(1,2,3,4,5)#其中的2,3,4,5都給了args
執行結果是:blog
1
(2, 3, 4, 5)
當args與位置參數和默認參數混用的狀況下:(注意三者的順序)class
示例1、(三者順序是:位置參數、默認參數、*args)di
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
執行結果是:字典
1
2
(3, 4, 5)
示例2、(三者順序是:位置參數、*args、默認參數)錯誤
def 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個角度來看(須要拆分來看):
一、從形參的角度來看:
示例:
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)
二、從實參的角度來看:
示例:
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
執行結果是:
1
2
3
——————————————————————————————————————————————————————————————————————————————————————
**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
{'y': 1, 'a': 2, 'b': 3, 'c': 4}
關於**kwargs與位置參數、*args、默認參數混着用的問題:(注意順序)
位置參數、*args、**kwargs三者的順序必須是位置參數、*args、**kwargs,否則就會報錯:
示例:
def foo(x,*args,**kwargs):
print(x)
print(args)
print(kwargs)
foo(1,2,3,4,y=1,a=2,b=3,c=4)#將1傳給了x,將2,3,4以元組方式傳給了args,y=1,a=2,b=3,c=4以字典的方式給了kwargs
執行結果是:
1
(2, 3, 4)
{'y': 1, 'a': 2, 'b': 3, 'c': 4}
錯誤示例:(因爲順序錯誤)
def 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
執行結果是:
1
1
{'a': 2, 'b': 3, 'c': 4}
其中關於**,能夠從2個角度來看(須要拆分來看):
一、從形參的角度來看:
示例:
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}
二、從實參的角度來看:
示例一:
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
執行結果是:
2
3
4
5
示例二:
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依舊按照默認參數
執行結果是:
2
3
4
1