Python *args 和 **kwargs

在编程中,我们定义一个函数来创建可重用的代码,它执行类似的操作。为了执行该操作,我们使用特定值调用函数,此值在 Python 中称为函数参数。

我们建议您阅读 Python 函数Python 函数参数

假设我们定义了一个函数来添加 3 个数字。

示例 1:添加 3 个数字的函数

def adder(x,y,z):
    print("sum:",x+y+z)

adder(10,12,13)

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

sum: 35

在上面的程序中,我们有一个 adder() 函数,带有三个参数 xyz。当我们调用 adder() 函数时传入三个值,我们将得到 3 个数字的总和作为输出。


让我们看看当我们在 adder() 函数中传入超过 3 个参数时会发生什么。

def adder(x,y,z):
    print("sum:",x+y+z)

adder(5,10,15,20,25)

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

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

在上面的程序中,我们向 adder() 函数传递了 5 个参数而不是 3 个参数,因此我们得到了 TypeError


Python 中 *args 和 **kwargs 的介绍

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

  1. *args(非关键字参数)
  2. **kwargs(关键字参数)

当不确定要向函数传递的参数数量时,我们使用 *args**kwargs 作为参数。


Python *args

如上例所示,我们不确定可以传递给函数的参数数量。Python 有 *args,它允许我们向函数传递可变数量的非关键字参数。

在函数中,我们应该在参数名前使用星号 * 来传递可变长度参数。参数作为 元组 传递,这些传递的参数在函数内部形成一个与参数名(不包括星号 *)相同的元组。

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

def adder(*num):
    sum = 0
    
    for n in num:
        sum = sum + n

    print("Sum:",sum)

adder(3,5)
adder(4,5,6,7)
adder(1,2,3,5,6)

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

Sum: 8
Sum: 22
Sum: 17

在上面的程序中,我们使用 *num 作为参数,它允许我们向 adder() 函数传递可变长度参数列表。在函数内部,我们有一个循环,它添加传递的参数并打印结果。我们向函数传递了 3 个不同长度的元组作为参数。


Python **kwargs

Python 使用 *args 向函数传递可变长度的非关键字参数,但我们不能用它来传递关键字参数。对于这个问题,Python 有一个解决方案,叫做 **kwargs,它允许我们向函数传递可变长度的关键字参数。

在函数中,我们在参数名前使用双星号 ** 来表示此类参数。参数作为字典传递,这些参数在函数内部形成一个与参数名(不包括双星号 **)相同的字典。

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

def intro(**data):
    print("\nData type of argument:",type(data))

    for key, value in data.items():
        print("{} is {}".format(key,value))

intro(Firstname="Sita", Lastname="Sharma", Age=22, Phone=1234567890)
intro(Firstname="John", Lastname="Wood", Email="[email protected]", Country="Wakanda", Age=25, Phone=9876543210)

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

Data type of argument: <class 'dict'>
Firstname is Sita
Lastname is Sharma
Age is 22
Phone is 1234567890

Data type of argument: <class 'dict'>
Firstname is John
Lastname is Wood
Email is [email protected]
Country is Wakanda
Age is 25
Phone is 9876543210

在上面的程序中,我们有一个 intro() 函数,参数为 **data。我们向 intro() 函数传递了两个具有可变参数长度的字典。我们在 intro() 函数内部有一个 for 循环,它处理传递的字典的数据并打印字典的值。


注意事项

  • *args**kwargs 是特殊关键字,允许函数接受可变长度的参数。
  • *args 传递可变数量的非关键字参数,并可对其执行元组操作。
  • **kwargs 传递可变数量的关键字参数字典给函数,并可对其执行字典操作。
  • *args**kwargs 使函数更灵活。
你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战