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

  • 相关阅读:
    洛谷 P1226 【模板】快速幂||取余运算 题解
    洛谷 P2678 跳石头 题解
    洛谷 P2615 神奇的幻方 题解
    洛谷 P1083 借教室 题解
    洛谷 P1076 寻宝 题解
    洛谷 UVA10298 Power Strings 题解
    洛谷 P3375 【模板】KMP字符串匹配 题解
    Kafka Shell基本命令
    Mybatis与Hibernate的详细对比
    MyBatis简介
  • 原文地址:https://www.cnblogs.com/hippieZhou/p/9898211.html
Copyright © 2011-2022 走看看