python 装包和拆包(*args 和 **kwargs)

*args 和 **kwargs 是两个常用参数:

	1、*args:用于接受多余的未命名的参数,元组类型;
	2、**kwargs:用于接受形参的命名参数,字典类型;
def myprint(*args, **kwargs):
    print('args')
    print(args) # 未拆包
    print(*args) # 进行拆包
    print('kwargs')
    print(kwargs)# 未拆包
    print(*kwargs)# 进行拆包(**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}
发布了26 篇原创文章 · 获赞 4 · 访问量 735

猜你喜欢

转载自blog.csdn.net/qq_36072270/article/details/103502856
今日推荐