• Python可变参数*args和**kwargs


    本文我们将通过示例了解 Python函数的可变参数*args**kwargs的用法。

    知识预备:Python 函数和 Python 函数参数

    在Python编程中,我们定义一个函数来生成执行类似操作的可重用代码。为了执行这个操作,我们调用一个具有特定值的函数,这个值在 Python 中称为函数参数。

    函数示例

    假设,我们定义了一个3个数相加的函数。

    示例1: 用于加3个数字的函数

    # 定义函数
    def add(x, y, z):
        print(f"总和: {x+y+z}")
    
    # 调用函数
    add(10,12,13)
    

    当我们运行上面的程序时,将会输出如下结果:

    总和: 35
    

    在上面的程序中,我们有三个参数 x,y 和 z 的加法函数。当我们在调用 add()函数传递三个值时,我们得到这三个数字的和作为输出。

    接下来,让我们看看当我们在add()函数中传递超过3个参数时会发生什么。

    # 定义函数
    def add(x, y, z):
        print(f"总和: {x+y+z}")
    
    # 调用函数
    add(5,10,15,20,25)
    

    当我们运行上面的程序时,输出将是

    TypeError: add() takes 3 positional arguments but 5 were given
    

    在上面的程序中,我们给add()函数传递了5个参数,而不是由于3个参数,并且得到 TypeError 错误。

    这很显然不是我们想要的效果,那么应该怎么解决这个问题呢?

    如果我们实际调用的时候,如果入参的个数是不确定的,就可以使用可变参数的语法来解决。


    Python可变参数

    在 Python 中,我们可以使用特殊符号向函数传递可变数量的参数。

    有两个特殊的符号:

    • *args:可变位置参数
    • **kwargs:可变关键字参数

    当我们不确定要在函数中传递的参数数量时,我们就可以在函数定义中,使用 *args**kwargs 作为形式参数。

    Python *args

    正如上面的例子一样,我们不确定可以传递给函数的参数数量。有 *args,允许我们传递可变数量的非关键字参数到函数中。

    在函数定义中,我们应该在参数名之前使用星号 * 来传递可变长度的参数。参数以元组的形式传递,这些传递的参数在函数内部使用与参数(不包括星号 *)相同的名称构成元组。

    例2: 使用 *args 将可变长度的参数传递给函数

    # 定义函数
    def add(*num):
        sum = 0
        for n in num:
            sum = sum + n
        print(f"总和: {sum}")
    
    # 调用函数
    add(3,5)
    add(4,5,6,7)
    add(1,2,3,5,6)
    

    在上面的程序中,我们使用 *num 声明形式参数,它允许我们向 add() 函数传递可变长度的参数列表。在函数内部,我们有一个循环,它把传递的实际参数相加,并打印结果。注意,这里调用了3次,分别传递了不同的值,它们的长度可变,作为函数的实际参数。

    当我们运行上面的程序时,输出将是:

    总和: 8
    总和: 22
    总和: 17
    

    Python **kwargs

    对于传递关键字参数这个问题,Python 有一个名为 **kwargs 的解决方案,它允许我们将可变长度的关键字参数传递给函数。

    具体做法是,在函数中,我们在参数名之前使用双星号**来表示这种类型的参数。接收到的参数在函数内构成一个dict字典对象,
    其名称与参数(不包括两个星号**)相同。

    示例3: 使用 **kwargs 将可变关键字参数传递给函数

    # 定义函数
    def intro(**data):
    
        print("实参的数据类型是:", type(data))
    
        for key, value in data.items():
            print(f"{key} is {value}")
    
    # 调用函数
    intro(name="小佛", age=30)
    intro(city="深圳", lan="Python", hobby="干饭")
    

    在上面的程序中,我们定义了一个以 **data 数据为形参的函数 intro ()。我们将两个长度可变的字典实参传递给 intro()函数。
    我们intro()函数中使用for循环,它对传递字典的数据项进行处理,并输出字典的值。

    当我们运行上面的程序时,输出结果将是:

    实参的数据类型是: <class 'dict'>
    name:小佛
    age:30
    实参的数据类型是: <class 'dict'>
    city:深圳
    lan:Python
    hobby:干饭
    

    总结

    值得注意的几点:

    • *args**kwargs是特殊的关键字,允许函数采用可变长度参数,让函数变得非常灵活。
    • *args**kwargs是约定俗称的名称,可以自定义,例如*cat,或者**dog
    • *args传递可变数量的位置参数,并且可以在其上执行元组的操作。
    • **kwargs传递可变数目的关键字参数,以便在其上执行字典的操作。

    --- END

  • 相关阅读:
    生产排程系统设计(二)设计思路
    一个ExtJs项目的Demo
    信息流与生产作业的同步与监控
    生产企业的IT人才储备困局
    生产排程系统设计(三)设计概要
    生产排程系统设计(一)设计愿景
    找工作时,你如何看待薪资问题
    sql 跨服务器 select ,update,insert
    Biztalk和Widows Wrokflow Fundation的区别和联系
    BizTalk 2010 虚拟环境分布式安装需要注意的问题
  • 原文地址:https://www.cnblogs.com/amoyshmily/p/16040232.html
Copyright © 2020-2023  润新知