Loading

Python3 系列之 可变参数和关键字参数

刚开始接触 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 中,函数参数主要分为:必选参数,默认参数,可变参数,关键字参数。必选参数必须赋值;默认参数可赋可不赋,如不赋值则传递默认的数值;可变参数传递的是一个参数列表,列表中的元素数量不确定;关键字参数是一个键值对集合,通过键值对的方式来进行数值传递。它们之间的排列顺序为:必选参数 -> 默认参数 -> 可变参数 -> 关键字参数。

posted @ 2018-12-23 19:01  hippieZhou  阅读(1677)  评论(0编辑  收藏  举报