刚开始接触 python 的时候,对 python 中的 *wargs (可变参数) 和 **kwargs (关键字参数)的理解不是很透彻,看了一下 《Explore Python》一书,里面对这一部分的描述相对浅显易懂, 这里依据个人理解进行相关总结。
可变参数(*args)
对于可变参数可以联想到 C# 中的可变参数。可变参数是一个数量不确定的列表集合,可以是 list 类型,也可以是 tuple 类型
我们定义如下代码段:
- def add(*numbers):
- print(type(numbers))
- sum = 0
- for i in numbers:
- sum += i
- return sum
-
- a1 = (1, 2, 3, 4,)
- print(add(*a1))
-
- a2 = [1, 2, 3, 4]
- print(add(*a2))
通过运行上述代码,我们可以看出,无论我们是需要传递一个 list 集合还是 tuple 集合,在可变参数对应的函数内部都会作为 tuple 类型来处理。此外,我们还需要注意的是,我们需要传递的是集合的指针,而不是该集合对象,这是因为在 python 中,默认通过引用(也就是指针)进行函数的参数传递,这样做避免创建多个拷贝,并且能够按照方便地更新这些对象。
由于在含可变参数的函数内部,可变参数是作为 tuple 类型来处理的, 因此我们无法对其进行修改。我们可以通过创建一个 list 类型的集合临时变量,然后通过这个临时变量实现对传入的可变参数进行修改。
关键字参数(**kwargs)
关键字参数是一个由键值对组成的集合,允许通过变量名进行匹配,而不是位置。
我们定义如下代码段:
- def add(**kwargs):
- print(type(kwargs))
- for key in kwargs:
- kwargs[key] += 1
- print('{0}:{1}'.format(key,kwargs[key]))
- dic = {'x': 1, 'y': 2,'z': 3}
- add(**dic)
运行上述代码,我们可以看出,kwargs 的类型为 dict ,因此我们需要用过 key-value 的方式来进行访问。当我们访问的 key 不在该参数列表中程序会发生响应。
综合运用
- def test_args_kwargs(arg1, *args, **kwargs):
- print(arg1)
-
- for val in args:
- print(val)
-
- for k, v in kwargs.items():
- print("{0}:{1}".format(k, v))
-
-
- test_args_kwargs(1, [1, 2, 3], {"a": 1, "b": 2})
总结
*args 和 **kwargs 并不是 python 中的参数关键字,而是一种惯用写法。
在 python 中,函数参数主要分为:必选参数,默认参数,可变参数,关键字参数。必选参数必须赋值;默认参数可赋可不赋,如不赋值则传递默认的数值;可变参数传递的是一个参数列表,列表中的元素数量不确定;关键字参数是一个键值对集合,通过键值对的方式来进行数值传递。它们之间的排列顺序为:必选参数 -> 默认参数 -> 可变参数 -> 关键字参数。