MEMOO
MEMOO
Published on 2025-04-20 / 4 Visits
0
0

Python *args参数

摘要:在本教程中,你将学习 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 函数接受三个参数xy*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 会解包该元组,并将其元素赋值给 xy 参数。

总结

  • 使用 Python 的 *args 参数来定义接受可变数量参数的函数。

  • *args 参数会耗尽位置参数,因此你只能在它之后使用关键字参数。


Comment