python *args和**kwargs以及序列解包

DAY 8. *args和**kwargs

*args:多值元组,**kwargs多值字典,他们是python函数传参时两个特殊的参数,args和kwargs并不是强制的,但习惯使用这两个,如果在函数参数列表中声明了*args,则允许传递任意多的参数,多余的参数会被以元组的形式赋给args变量,而**kwargs允许你使用没有定义的变量名,会把显式传递的参数打包成字典

def output(*args, **kwargs):
    print(args)
    print(kwargs)

output('zhangsan', 'lisi', 5, 6,a=1,b=2,c=3)

# ('zhangsan', 'lisi', 5, 6)
# {'a': 1, 'b': 2, 'c': 3}

如果函数还有别的参数,传递参数时会从左到右依次对照赋值,所以请务必把*args**kwargs放在函数参数列表的最后,否则会抛出TypeError异常,并且*args必须放在**kwargs前面,正确的参数顺序应该是

def fun(arg, *args, **kwargs):
    pass

在调用函数时也可以使用***

def put(a, b, c):
    print(f'a={a},b={b},c={c}')

put(*mylist)  # a=aardvark,b=baboon,c=cat

s = {'a': 1, 'b': 2, 'c': 3}
put(**s)  # a=1,b=2,c=3

之所以能实现这样的功能,原理是序列解包,下面简单介绍序列解包

>>> s = "ABCDE"
>>> a,b,c,d,e = s
>>> a,c
('A', 'C')

>>> t = (1,2,3,4,5)
>>> a1,b1,c1,d1,e1 = t
>>> a1,c1
(1, 3)

上面就是用到了序列解包,左右两端的元素个数必须相等,否则会抛出ValueError异常

>>> a2,b2 = s
Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    a2,b2 = s
ValueError: too many values to unpack (expected 2)

但总不能所有序列都一一对应把,如果序列有很多位或不确定有多少位时使用序列解包就显得很不方便了,这时候就可以使用*和了

>>> a3,*a4 = s
>>> a3,a4
('A', ['B', 'C', 'D', 'E'])
>>> while s:
        f,*s = s
        print(f,s)

A ['B', 'C', 'D', 'E']
B ['C', 'D', 'E']
C ['D', 'E']
D ['E']
E []

参考文章:

详解Python序列解包(4)

stack overflow

从一个例子看Python3.x中序列解包

GitHub python面试题

发布了62 篇原创文章 · 获赞 33 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zjbyough/article/details/96511437