解包和压包
将元祖、列表、字典、字符串、生成器等整体中的每个元素当成个体剥离出来,这个过程就是解包,反过来即为压包。
用于函数定义时
在python中,*arg与**kwargs用于函数定义时,均为可变参数,*arg表示任意多个无名参数,类型为tuple;**kwargs表示关键字参数,为dict。
def func(*args,**kwargs):
print(type(args))
print(args)
print(type(kwargs))
print(kwargs)
if __name__ == '__main__':
func(1,2,3,4,a=5,b=6,c=7)
'''
输出结果:
<class 'tuple'>
(1, 2, 3, 4)
<class 'dict'>
{'a': 5, 'b': 6, 'c': 7}
'''
总结:在python中,当*和**符号出现在函数定义的参数中时,用于动态传参,是一个压包的过程。
- *arg表示任意多个无名参数,类型为tuple
- **kwargs表示关键字参数,为dict
使用时需将*arg放在**kwargs之前,否则会有“SyntaxError: non-keyword arg after keyword arg”的语法错误。
用于函数调用时
反过来,如果*和**语法出现在函数调用中又会如何呢?
*和**都会起到解包传参的作用。我们在调用函数时能够使用*语法,在这种情况下,它与函数定义的意思相反,他会解包参数,而不是压包。
def func(a, b, c, d):
print(a, b, c, d)
if __name__ == '__main__':
test1 = (1, 2, 3, 4)
test2 = [1, 2, 3, 4]
test3 = {1, 2, 3, 4}
test4 = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
func(*test1)
func(*test2)
func(*test3)
func(**test4)
'''
输出结果:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
'''
总结:在函数调用时,*和**用于解包参数的集合。
- *会以单个元素的形式解包序列(如元组、列表、集合),使其成为独立的参数。
- **会以键值对的形式解包字典,使其成为独立的关键字参数。