如果我们不确定要往函数中传入多少个参数,或者我们想往函数中以列表和元组的形式传递参数时要用 * args;如果我们不知道要往函数中传入多少个关键词参数,或者想传入字典的值作为关键词参数时,那就要使用 ** kwargs。
注意: * args和 ** kwargs可以同时在函数的定义中,但是 * args必须在 * *kwargs前面。

def suibian(*args,**kwargs):
    print(args)
    print(kwargs)
suibian(1,2,3,[1,2,3],{'name':'apollo','age':28})

# 这里体现的是聚合的效果,

打印结果:

(1, 2, 3, [1, 2, 3], {'name': 'apollo', 'age': 28})
{}
注意:{'name':'apollo','age':28})并没有进入到kwargs中,原因他不是一个键值对

将上面代码稍加改造
def suibian(*args,**kwargs):
    print(args)
    print(kwargs)
suibian(1,2,3,[1,2,3],name='apollo',age=28)

# 原来字典形式,现在直接用键值对传入,效果大不一样

打印结果:

(1, 2, 3, [1, 2, 3])
{'name': 'apollo', 'age': 28}


def suibian(*args,**kwargs):
    print(args)
    print(kwargs)
suibian(1,2,3,hobby='swimming',*[1,2,3],**{'name':'apollo','age':28})

# 这里体现的是打散功能,我们看到,

在列表前加*,结果会把列表里面的内容迭代添加到args里面,

在字典前面加**,会把字典的键值对迭代添加到kwargs中,而不是把整个字典加到了args中.