【Python】*args 和 **kwargs
*args
允许事先没有确定函数需要传递的参数个数
表示将实参中按照位置传值,多出来的值都赋给args,并且以元组的方式呈现
def foo(x, *args):
print x
print args
foo(1,2,3,4,5)
程序输出:
1
(2, 3, 4, 5)
当args与位置参数和默认参数混用时:
位置参数:x
默认参数:y=1
- 三者顺序:位置参数、默认参数、*args
def foo(x, y=1, *args):
print x
print y
print args
foo(1,2,3,4,5)
程序输出:
1
2
(3, 4, 5)
关于*:
- 从形参的角度
(1, 2, 3, 4, 5)被当做元组传送给args
def foo(*args):
print args
foo(1,2,3,4,5)
程序输出:
(1, 2, 3, 4, 5)
- 从实参的角度
*(1,2,3,4,5)指代*args
def foo(a,b,c,d,e):
print a
print b
print c
print d
print e
foo(*(1,2,3,4,5))
程序输出:
1
2
3
4
5
**kwargs
允许没有事先定义参数名
按照关键字传值把多余的传值以字典的方式呈现
def foo(x, **kwargs):
print x
print kwargs
foo(1, a=1, b=2, c=3)
程序输出:
1
{'a': 1, 'c': 3, 'b': 2}
当**kwargs与位置参数、*args默认参数混用时:
- **kwargs、位置参数、*args三者位置顺序必须为:位置参数、*args、**kwargs
def foo(x, *args, **kwargs):
print x
print args
print kwargs
foo(1, 2,3,4,a=1, b=2, c=3)
1传给位置参数x
2,3,4作为元组传递给*args
a=1, b=2, c=3作为字典传递给**kwargs
程序输出:
1
(2, 3, 4)
{'a': 1, 'c': 3, 'b': 2}
- **kwargs、位置参数、默认参数三者的位置顺序必须为:位置参数、默认参数、**kwargs
def foo(x, y=1, **kwargs):
print x
print y
print kwargs
foo(1,a=1, b=2, c=3)
程序输出:
1
1
{'a': 1, 'c': 3, 'b': 2}
关于**
- 从形参角度
相当于foo(a,b,c)
def foo(**kwargs):
print kwargs
foo(a=1, b=2, c=3)
程序输出:
{'a': 1, 'c': 3, 'b': 2}
- 从实参角度
将字典里的每个值按照关键字传值的方式传给a,b,c
def foo(a,b,c):
print a
print b
print c
foo (**{"a":1,"b":2,"c":3})
程序输出:
1
2
3
总结
无论是作为形参还是实参
*
+ 元组
**
+ 字典