介绍
Python 是全球最受欢迎的编程语言之一。在 Python 中,参数是函数定义的一部分。它们使您能够为函数指定某些实参。该实参可以被函数接收并应用。
然而,在编写代码时,您不可能知道您的代码可能会实现哪些确切的使用场景。因此,为了方便未来的程序员和您程序的用户,建议向函数传递可变数量的参数。为此,您必须使用特殊的参数。它们是 *args 和 **kwargs。在本教程中,我们将全面学习 *args 和 **kwargs 参数。我们还将学习如何对参数进行排序,以及如何在函数调用中应用它们。
前提条件
为了能够按照本教程中的步骤进行操作,您需要准备一些前提条件。首先,您需要在您的服务器上安装 Python 3,并运行编程环境。您还需要安装适用于您特定操作系统的程序(Ubuntu, CentOS、Debian 等)。
什么是 *args,它是如何工作的?
让我们首先来了解 *args 是如何工作的。该参数的单星号版本用于向函数发送非关键字的可变长度参数列表。请记住,星号是该参数中最关键的元素。
为了更好地理解,让我们来看一个例子。以下是您在代码中可能会遇到的一个典型函数,它使用了两个参数:
|
1 2 |
def multiply(x, y): print (x * y) |
如您所见,我们在上述函数中的参数是 x 和 y。在调用该函数时,您将使用对应于 x 和 y 的数字。假设我们分别为 5 和 4 传递整数 x 和 y :
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4) |
现在我们可以运行代码:
|
1 |
python lets_multiply.py |
我们将收到的输出如下:
|
1 2 3 |
Output: 20 |
输出显示整数 5 和 4 已经相乘。这意味着 multiply(x, y) 函数起作用了。
现在,假设我们最终想要将三个数字相乘,而不仅仅是两个。不幸的是,向上述函数添加一个额外的数字会给您带来如下错误:
|
1 2 3 4 |
def multiply(x, y): print (x * y) multiply(5, 4, 3) |
|
1 2 3 |
Output: TypeError: multiply() takes 2 positional arguments but 3 were given |
因此,如果您预料到以后可能需要添加更多参数,那么为了方便起见,请应用 *args 参数。您可以像这样使用它:
|
1 2 3 4 5 6 7 8 9 10 |
def multiply(*args): z = 1 for num in args: z *= num print(z) multiply(4, 5) multiply(10, 9) multiply(2, 3, 4) multiply(3, 5, 10, 6) |
我们只需将 x 和 y 函数参数替换为 *args。运行此代码将为您提供每个函数调用的乘积,如下所示:
|
1 2 3 4 5 6 |
Output: 20 90 24 900 |
因此, *args 非常适合在您想要向函数发送可变长度参数列表时使用。由于它的这种能力,您可以向函数调用传递任意数量的参数。因此,该参数允许您构建更灵活的代码,从而可以接受大量可变的、非关键字的参数到函数中。
什么是 **kwargs,它是如何工作的?
接下来,我们有双星号版本的参数,即 **kwargs。与前一种形式不同,此参数允许您将关键字化的、可变长度的参数字典传递到函数中。类似于 *args,双星号是该参数最关键的元素。
正如我们在上一节中所做的那样,您可以根据需要添加任意数量的参数。区别在于您必须分配关键字。为了更好地理解,请考虑以下示例。在这里,我们将首先打印出 **kwargs 我们想要传递给函数的参数:
|
1 2 |
def print_kwargs(**kwargs): print(kwargs) |
现在,让’我们调用该函数。如您所见,我们添加了关键字参数:
|
1 2 3 4 |
def print_kwargs(**kwargs): print(kwargs) print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True) |
此时运行程序将显示以下输出:
|
1 |
python print_kwargs.py |
|
1 2 3 |
输出: {'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'} |
然而,您的字典数据类型有可能是无序的。这在很大程度上取决于您使用的 Python 3 版本。例如,Python 3.6 之后的任何版本都会按顺序为您提供键值对。在此之前的任何版本都将以随机顺序显示输出。您创建的字典将被命名为 kwargs。请注意,您可以像系统上的任何其他字典一样使用和操作它。让我们看看如何将 **kwargs 参数投入更大范围的使用和应用中。
在以下示例中,我们将尝试创建一个新函数,该函数将向包含名字的字典致意。我们的示例字典将包含两个名字:
|
1 2 3 4 5 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values(my_name="Sammy", your_name="Casey") |
运行程序将为您提供以下输出:
|
1 |
python print_values.py |
|
1 2 3 4 |
输出: The value of your_name is Casey The value of my_name is Sammy |
与前面的示例类似,字典可能会显示为无序。因此,在某些情况下,名字 Casey 和 Sammy 的顺序可能会颠倒。
接下来,我们将向函数传递额外的参数。这将证明您可以让 **kwargs 接受您想要的任意数量的参数:
|
1 2 3 4 5 6 7 8 9 10 11 |
def print_values(**kwargs): for key, value in kwargs.items(): print("The value of {} is {}".format(key, value)) print_values( name_1="Alex", name_2="Gray", name_3="Harper", name_4="Phoenix", name_5="Remy", name_6="Val") |
运行程序将显示以下输出:
|
1 2 3 4 5 6 7 8 |
输出: The value of name_2 is Gray The value of name_6 is Val The value of name_4 is Phoenix The value of name_5 is Remy The value of name_3 is Harper The value of name_1 is Alex |
此输出也可能是无序的。无论如何,这些示例表明 **kwargs 为您的程序提供了使用多个关键字参数的灵活性。
How to Order Arguments
在函数或函数调用中对参数进行排序时,务必牢记设定的顺序。如下所示:
-
Formal positional arguments
-
*args
-
Keyword arguments
-
**kwargs
让’我们假设您正在使用 *args 和 **kwargs 具有显式位置参数。这意味着您的函数将如下所示:
|
1 2 |
def example(arg_1, arg_2, *args, **kwargs): ... |
另一方面,将这些参数与命名关键字参数一起使用,将使您的函数具有以下通用结构:
|
1 2 |
def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs): ... |
不遵守设定的顺序会在运行代码时导致语法错误。因此,最好从一开始就避免犯这种错误。
如何在函数调用中使用 *args 和 **kwargs
最后,我们将向您展示如何使用这两个参数将参数传递到函数中。我们将从一个示例开始,该示例显示了 *args:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) args = ("Sammy", "Casey", "Alex") some_args(*args) |
此函数中有三个参数: arg_1, arg_2,以及 arg_3。您必须创建一个变量并将其设置为可迭代对象。在这种情况下,它将是一个 tuple。然后,您可以使用星号语法将该变量传递到函数中。
使用以下命令运行程序时,观察输出: python some_args.py 命令:
|
1 2 3 4 5 |
输出: arg_1: Sammy arg_2: Casey arg_3: Alex |
也可以将程序更改为可迭代的列表 数据类型,并使用不同的变量作为名称。以下代码结合了 *args 与命名参数:
|
1 2 3 4 5 6 7 8 |
def some_args(arg_1, arg_2, arg_3): print("arg_1:", arg_1) print("arg_2:", arg_2) print("arg_3:", arg_3) my_list = [2, 3] some_args(1, *my_list) |
运行程序时的输出如下:
|
1 2 3 4 5 |
输出: arg_1: 1 arg_2: 2 arg_3: 3 |
另一方面,您可以使用 **kwargs 应用关键字参数。确保创建一个等于字典的变量。它应该有 2 个键值对。以下是我们如何将该变量传递给具有 3 个参数的函数的方法:
|
1 2 3 4 5 6 7 8 |
def some_kwargs(kwarg_1, kwarg_2, kwarg_3): print("kwarg_1:", kwarg_1) print("kwarg_2:", kwarg_2) print("kwarg_3:", kwarg_3) kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"} some_kwargs(**kwargs) |
再次使用 python some_kwargs.py 命令来运行程序:
|
1 2 3 4 5 |
输出: kwarg_1: Val kwarg_2: Harper kwarg_3: Remy |
结论
在本教程结束时,您应该已经熟练掌握了什么是 *args 和 **kwargs 以及它们是如何工作的。您现在可以将这些参数应用到您自己的代码中,使您的程序对未来的用户更加灵活。这些非常适合您不知道可能会使用多少个参数的情况。只需确保注意函数和参数的关键要素即可。
最后,这里有更多来自我们博客的资源,将帮助您成功使用 Python:
- txt 文件格式:在 Python 3 中处理纯文本文件
- Python 3 中的循环:使用 Break、Continue 和 Pass 语句
- 在 Python 3 中导入模块:全面指南
- 使用 Python 3 字符串格式化工具
- 使用 Python 3 编程:如何构建类 and 定义对象?
祝您编程愉快!
评论
暂无评论。发表第一条评论吧。