*args 和 **kwargs 是两个常用参数:
1、*args:用于接受多余的未命名的参数,元组类型;
2、**kwargs:用于接受形参的命名参数,字典类型;
def myprint(*args, **kwargs):
print('args')
print(args)
print(*args)
print('kwargs')
print(kwargs)
print(*kwargs)
一、
myprint(1, 2, 3, 4, 8, a= 5, c=7)
输出:
args
(1, 2, 3, 4, 8)
1 2 3 4 8
kwargs
{'a': 5, 'c': 7}
a c
二、
myprint(*(1, 2, 3, 4,), 8, a= 5, c=7)
输出:
args
(1, 2, 3, 4, 8)
1 2 3 4 8
kwargs
{'a': 5, 'c': 7}
a c
三、
myprint((1, 2, 3, 4,), 8, a= 5, c=7)
输出:
args
((1, 2, 3, 4), 8)
(1, 2, 3, 4) 8
kwargs
{'a': 5, 'c': 7}
a c
四、
myprint(*(1, 2, 3, 4,), 8, {'a':5}, c=7)
输出:
args
(1, 2, 3, 4, 8, {'a': 5})
1 2 3 4 8 {'a': 5}
kwargs
{'c': 7}
c
五、
myprint(*(1, 2, 3, 4,), 8, *{'a':5}, c=7)
输出:
args
(1, 2, 3, 4, 8, 'a')
1 2 3 4 8 a
kwargs
{'c': 7}
c
六、
myprint(*(1, 2, 3, 4,), 8, **{'a':5}, c=7)
输出:
args
(1, 2, 3, 4, 8)
1 2 3 4 8
kwargs
{'a': 5, 'c': 7}
a c
1、形参中的 *args 是接受数据的 args,它是一个元组,把传入的数据放进 args 元组中;
2、函数中的 args 仍然是元组,*args 就是将元组的数据进行拆包,一开始输入的形式;
关键字参数 **kwargs:
kwargs 是未拆包的
*kwargs 是进行拆包的
1、*args 用来接受多余的未命名参数,**kwargs 是用来接受命名的参数;
2、装包的意义就是把未命名的参数和命名的参数放在元组或字典中;
七、注意
1、在传入参数时,可变参数(*)之前不能指定参数名;
def test(a, *b):
print(a)
print(b)
test(a=1, 2, 3)
test(a=1, 2, 3)
^
SyntaxError: positional argument follows keyword argument
2、函数传入实参时,可变参数(*)之后必须指定参数名,否则就会被归到可变参数之中;
def test(a, *b, c=None):
print(a)
print(b)
print(c)
test(1, 2, 3, c=4)
1
(2, 3)
4
3、一个函数想要使用时必须指定参数名,可以将所有参数都放在可变参数之后;
def test(*, a, b):
print(a)
print(b)
test(a=1, b=2)
1
2
4、关键字参数都只能作为最后一个参数,签名的参数按照位置赋值还是名称赋值都可以;
def test(a, *b, c, **d):
print(a)
print(b)
print(c)
print(d)
test(1, 2, c=4, d=5, e=6, f=7)
1
(2,)
4
{'d': 5, 'e': 6, 'f': 7}