Python Args 和 Kwargs

PythonBeginner
立即练习

介绍

在这个 Lab 中,你将学习 Python 中的 *args 和 **kwargs。这些特殊的语法起初可能看起来令人生畏,但它们很容易理解,并为使你的函数更具灵活性提供了一种强大的方式。你将学习如何定义可以接受可变数量参数的函数,这是许多 Python 程序和库中常见且有用的特性。

Args 和 Kwargs

在这一步,你将学习 *args 和 **kwargs 的基本语法。它们用于函数定义中,以允许传递不确定数量的参数。*args 用于非关键字、位置参数,而 **kwargs 用于关键字参数。

注意: 如果你不熟悉使用 WebIDE(类似 VS Code),请先在 这个实验 学习。

首先,我们来看如何定义一个可以接受任意参数组合的函数。在左侧的文件浏览器中,找到位于 ~/project 目录下的文件 main.py 并在编辑器中打开它。

将以下代码添加到 main.py 中:

## 定义一个可以接受任意数量的位置参数和关键字参数的函数
def some_function(*args, **kwargs):
    print("This function can accept any arguments.")
    print(f"Received positional arguments: {args}")
    print(f"Received keyword arguments: {kwargs}")
    print("-" * 20)

## 使用任意数量的位置参数调用
some_function('arg1', 'arg2', 'arg3')

## 使用任意数量的关键字参数调用
some_function(key1='arg1', key2='arg2', key3='arg3')

## 同时使用位置参数和关键字参数调用
some_function('positional_arg', key1='keyword_arg')

## 或者完全不带参数调用
some_function()

需要注意的是,args 和 kwargs 仅仅是命名约定。单个星号 (*) 和双星号 (**) 才是真正起作用的语法。然而,遵循约定被认为是 Python 社区中的良好实践。

现在,通过在 WebIDE 中打开一个终端并执行以下命令来运行脚本:

python3 main.py

你应该会看到以下输出,它展示了函数如何处理不同的调用:

This function can accept any arguments.
Received positional arguments: ('arg1', 'arg2', 'arg3')
Received keyword arguments: {}
--------------------
This function can accept any arguments.
Received positional arguments: ()
Received keyword arguments: {'key1': 'arg1', 'key2': 'arg2', 'key3': 'arg3'}
--------------------
This function can accept any arguments.
Received positional arguments: ('positional_arg',)
Received keyword arguments: {'key1': 'keyword_arg'}
--------------------
This function can accept any arguments.
Received positional arguments: ()
Received keyword arguments: {}
--------------------

这表明 *args 将位置参数收集到一个元组 (tuple) 中,而 **kwargs 将关键字参数收集到一个字典 (dictionary) 中。

args

在这一步,你将专注于 *args。此语法允许函数接受任意数量的位置参数。这些参数会被收集到一个元组 (tuple) 中。

清除 main.py 中之前的内容,并添加以下代码。此示例定义了一个接受 *args 的函数,并打印它接收到的参数及其类型。

## *args collects positional arguments into a tuple
def some_function(*args):
    print(f'Arguments passed: {args} as {type(args)}')

## Pass multiple arguments - they'll be collected into the args tuple
some_function('arg1', 'arg2', 'arg3')

在这段代码中,函数签名中的 *args 告诉 Python 将传递给 some_function 的所有额外位置参数收集起来,并将它们放入一个名为 args 的元组中。

现在,从终端运行脚本:

python3 main.py

输出将确认这些参数是以元组形式传递的:

Arguments passed: ('arg1', 'arg2', 'arg3') as <class 'tuple'>

这展示了 *args 如何提供一种简单的方式来处理可变数量的输入,而无需将每个输入都定义为一个单独的参数。

kwargs

在这一步,你将学习如何使用 **kwargs。此语法用于将任意数量的关键字参数收集到一个字典 (dictionary) 中。当你需要处理事先未定义的命名参数时,这非常有用。

清除 main.py 的内容,并添加以下代码。此示例定义了一个接受 **kwargs 的函数,并打印收集到的关键字参数及其类型。

## **kwargs collects keyword arguments into a dictionary
def some_function(**kwargs):
    print(f'keywords: {kwargs} as {type(kwargs)}')

## Pass keyword arguments - they'll be collected into the kwargs dict
some_function(key1='arg1', key2='arg2')

在这里,函数签名中的 **kwargs 告诉 Python 将传递给 some_function 的所有关键字参数收集到一个名为 kwargs 的字典中。字典的键是参数名,值是参数值。

从终端运行脚本:

python3 main.py

输出将显示关键字参数已被收集到一个字典中:

keywords: {'key1': 'arg1', 'key2': 'arg2'} as <class 'dict'>

此功能在 Python 中被广泛用于需要传递选项或配置的函数,从而实现清晰且易读的函数调用。

总结

在这个实验 (Lab) 中,你学习了如何在 Python 中使用 *args 和 **kwargs 来创建更灵活的函数。

你了解到:

  • *args 将可变数量的位置参数收集到一个元组 (tuple) 中。
  • **kwargs 将可变数量的关键字参数收集到一个字典 (dictionary) 中。
  • args 和 kwargs 是约定俗成的名称,但启用此功能的关键是 * 和 ** 语法。

掌握 *args 和 **kwargs 是编写更高级和可重用 Python 代码的关键一步。你现在可以创建对不同类型的输入更具适应性的函数了。