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

  • 相关阅读:
    如何向MyEclipse项目的文件夹中添加JSP页面?
    MyEclipse中如何安装插件(以Subclipse为例)[转]
    s:textarea中的文本内容在什么时候才能被赋值给Action中的属性?
    由 s:hidden 引起的文本框内容不能传到 struts的Action中
    centos6分区与格式化数据盘、挂载磁盘的方法
    node实现后台权限管理系统
    在ERP软件行业项目应该怎么做?
    中小公司的Java工程师应该如何逆袭冲进BAT?
    Adminer轻量级MySQL管理工具,替代phpMyAdmin
    远程桌面连接失败了,提示身份验证错误,要求的函数不受支持
  • 原文地址:https://www.cnblogs.com/hippieZhou/p/9898211.html
Copyright © 2011-2022 走看看