跳到主要内容

Python *args 和 **kwargs

提示
  1. *args 的作用:*args 允许在函数中传递可变数量的非关键字参数,它们作为一个元组传递给函数。
  2. **kwargs 的用途:**kwargs 使得向函数传递可变数量的关键字参数成为可能,这些参数以字典形式传递。
  3. *args 和 **kwargs 的灵活性:*args 和 **kwargs 提高了函数的灵活性,使函数能够处理不定数量的参数,无论是普通参数还是关键字参数。

在编程中,我们定义函数以创建可重用代码,用于执行相似的操作。为了执行这些操作,我们用特定值调用函数,这个值在Python中被称为函数参数。

假设,我们定义了一个用于加三个数的函数。

示例 1:加三个数的函数

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

adder(10,12,13)

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

sum: 35

在上面的程序中,我们有一个带有三个参数 x、y 和 z 的adder()函数。当我们在调用adder()函数时传递三个值时,我们得到的输出是这三个数字的和。

让我们看看在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

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

*args 和 **kwargs 在 Python 中的介绍

在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="johnwood@nomail.com", 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 johnwood@nomail.com
Country is Wakanda
Age is 25
Phone is 9876543210

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

需要记住的事情

  • *args 和 **kwargs 是特殊关键字,允许函数接受可变长度的参数。
  • *args 传递可变数量的非关键字参数,并可以对元组进行操作。
  • **kwargs 传递可变数量的关键字参数字典给函数,并可以对字典进行操作。
  • *args 和 **kwargs 使函数更灵活。