摘要:在本教程中,你将学习 Python 的 *args
参数以及如何使用它们来定义可变参数函数。
元组解包
x, y = 10, 20
Python 将 10 赋值给 x
,将 20 赋值给 y
。这类似于将两个参数传递给一个函数:
def add(x, y):
return x + y
add(10, 20)
在这个例子中,Python 将 10 赋值给 x
,将 20 赋值给 y
。
类似地,以下代码将 10 赋值给 x
,20 赋值给 y
,并将列表 [30, 40]
赋值给 z
:
x, y, *z = 10, 20, 30, 40
print(x)
print(y)
print(z)
输出:
10
20
[30, 40]
Python 对函数参数也使用了相同的概念。例如:
def add(x, y, *args):
total = x + y
for arg in args:
total += arg
return total
result = add(10, 20, 30, 40)
print(result)
输出:
100
add
函数接受三个参数x
、y
和 *args
, *args
是一个特殊的参数,前面带有一个星号(*
)。
当将位置参数 10、20、30 和 40 传递给该函数时,Python 将 10 赋值给 x
,20 赋值给 y
,并将一个元组 (30, 40)
赋值给 args
。
这就像元组解包一样,只不过 args
是一个元组,而不是列表。
Python *args 参数介绍
当函数有一个参数前面带有星号(*
)时,它可以接受可变数量的参数。你可以向 *args
参数传递零个、一个或多个参数。
在 Python 中,像 *args
这样的参数称为可变参数,具有可变参数的函数称为可变参数函数。
请注意,你不需要为可变参数命名为 args
。例如,你可以使用任何有意义的名称,如 *numbers
、*strings
、*lists
等。
然而,按照惯例,Python 使用 *args
作为可变参数。
让我们来看下面的示例:
def add(*args):
print(args)
add()
输出:
()
add
函数显示了一个空元组。
以下展示了 args
参数的类型及其内容:
def add(*args):
print(type(args))
print(args)
add()
输出:
<class 'tuple'>
()
由于我们没有向 add()
函数传递任何参数,因此输出显示了一个空元组。
以下代码向 add()
函数传递了三个参数:
def add(*args):
print(args)
add(1,2,3)
输出:
(1, 2, 3)
现在args
包含了三个数字 1、2 和 3。
要访问 args
参数的每个元素,你可以使用方括号表示法 []
并指定一个索引:
def add(*args):
print(args[0])
print(args[1])
print(args[2])
add(1, 2, 3)
输出:
1
2
3
此外,你可以使用 for
循环来遍历元组中的元素。
以下展示了如何在 add()
函数中对 args
元组中的所有数字进行求和:
def add(*args):
total = 0
for arg in args:
total += arg
return total
total = add(1, 2, 3)
print(total)
输出:
6
Python 中的 *args
参数会接收剩余的全部位置参数
如果你使用了 *args
参数,则不能再添加更多的位置参数。不过,你可以使用关键字参数。
以下示例会导致错误,因为它在 *args
参数之后使用了位置参数:
def add(x, y, *args, z):
return x + y + sum(args) + z
add(10, 20, 30, 40, 50)
错误:
TypeError: add() missing 1 required keyword-only argument: 'z'
要修复这个问题,你需要在 *args
参数之后使用关键字参数,如下所示:
def add(x, y, *args, z):
return x + y + sum(args) + z
result = add(10, 20, 30, 40, z=50)
print(result)
输出:
150
在这个示例中,Python 将 10 赋值给 x
,20 赋值给 y
,(30,40)
赋值给 args
,50 赋值给 z
。
参数解包
以下 point
函数接受两个参数,并返回一个表示具有 x 坐标和 y 坐标的点的字符串:
def point(x, y):
return f'({x},{y})'
如果你将一个元组传递给 point
函数,你会得到一个错误:
a = (0, 0)
origin = point(a)
错误:
TypeError: point() missing 1 required positional argument: 'y'
要解决这个问题,你需要在元组 a
前面加上 *
运算符,像这样:
def point(x, y):
return f'({x},{y})'
a = (0, 0)
origin = point(*a)
print(origin)
输出:
(0, 0)
当你使用 *
运算符作为参数 a
的前缀时,Python 会解包该元组,并将其元素赋值给 x
和 y
参数。
总结
使用 Python 的
*args
参数来定义接受可变数量参数的函数。*args
参数会耗尽位置参数,因此你只能在它之后使用关键字参数。