如何在 Python 函数调用中组合使用 *args 和 **kwargs

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Python 的 *args 和 **kwargs 是强大的特性,可让你编写更灵活、动态的函数。在本教程中,我们将探讨如何结合这两种技术来创建通用的函数调用,以处理可变数量的参数和关键字参数。到最后,你将扎实地理解如何利用 *args 和 **kwargs 来编写更健壮、适应性更强的 Python 代码。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python/FunctionsGroup -.-> python/function_definition("Function Definition") python/FunctionsGroup -.-> python/arguments_return("Arguments and Return Values") python/FunctionsGroup -.-> python/default_arguments("Default Arguments") python/FunctionsGroup -.-> python/keyword_arguments("Keyword Arguments") python/FunctionsGroup -.-> python/lambda_functions("Lambda Functions") subgraph Lab Skills python/function_definition -.-> lab-417958{{"如何在 Python 函数调用中组合使用 *args 和 **kwargs"}} python/arguments_return -.-> lab-417958{{"如何在 Python 函数调用中组合使用 *args 和 **kwargs"}} python/default_arguments -.-> lab-417958{{"如何在 Python 函数调用中组合使用 *args 和 **kwargs"}} python/keyword_arguments -.-> lab-417958{{"如何在 Python 函数调用中组合使用 *args 和 **kwargs"}} python/lambda_functions -.-> lab-417958{{"如何在 Python 函数调用中组合使用 *args 和 **kwargs"}} end

理解 *args 和 **kwargs

什么是 *args 和 **kwargs?

在 Python 中,*args**kwargs 是函数定义中用于处理可变数量参数的特殊语法。它们允许函数接受任意数量的位置参数(*args)和/或关键字参数(**kwargs)。

*args(非关键字参数)

*args 语法允许函数接受任意数量的位置参数。这些参数随后被打包成一个元组,可以在函数内部进行迭代。当你事先不知道函数将接收多少个参数时,这很有用。

def print_numbers(*args):
    for arg in args:
        print(arg)

print_numbers(1, 2, 3)  ## 输出:1 2 3
print_numbers(4, 5, 6, 7, 8)  ## 输出:4 5 6 7 8

**kwargs(关键字参数)

**kwargs 语法允许函数接受任意数量的关键字参数。这些参数随后被打包成一个字典,其中键是参数名称,值是相应的参数值。当你想将任意数量的命名参数传递给函数时,这很有用。

def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(name="LabEx", age=30, city="New York")
## 输出:
## name: LabEx
## age: 30
## city: New York

组合使用 *args 和 **kwargs

你可以在同一个函数定义中同时使用 *args**kwargs*args 将收集所有的位置参数,而 **kwargs 将收集所有的关键字参数。

def print_all(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_all(1, 2, 3, name="LabEx", age=30)
## 输出:
## 1
## 2
## 3
## name: LabEx
## age: 30

在这个例子中,函数 print_all() 可以接受任意数量的位置参数(*args)和任意数量的关键字参数(**kwargs)。

在函数调用中使用 *args 和 **kwargs

向函数传递 *args

要将可变数量的位置参数传递给接受 *args 的函数,你可以使用 * 运算符简单地解包这些参数。

def print_numbers(*args):
    for arg in args:
        print(arg)

numbers = [1, 2, 3, 4, 5]
print_numbers(*numbers)
## 输出:
## 1
## 2
## 3
## 4
## 5

在这个例子中,*numbers 表达式解包了 numbers 列表的元素,并将它们作为单独的参数传递给 print_numbers() 函数。

向函数传递 **kwargs

要将可变数量的关键字参数传递给接受 **kwargs 的函数,你可以使用 ** 运算符将字典解包为关键字参数。

def print_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")

info = {"name": "LabEx", "age": 30, "city": "New York"}
print_info(**info)
## 输出:
## name: LabEx
## age: 30
## city: New York

在这个例子中,**info 表达式解包了 info 字典的键值对,并将它们作为单独的关键字参数传递给 print_info() 函数。

在函数调用中组合使用 *args 和 **kwargs

你也可以在同一个函数调用中组合使用 *args**kwargs*args 将收集所有的位置参数,而 **kwargs 将收集所有的关键字参数。

def print_all(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_all(1, 2, 3, name="LabEx", age=30)
## 输出:
## 1
## 2
## 3
## name: LabEx
## age: 30

在这个例子中,123 作为位置参数传递给 *args,而 nameage 作为关键字参数传递给 **kwargs

*args 和 **kwargs 的实际示例

用于算术运算的可变参数函数

让我们创建一个函数,它可以对任意数量的参数执行各种算术运算。

def arithmetic_operations(*args, operator='+'):
    result = args[0]
    for i in range(1, len(args)):
        if operator == '+':
            result += args[i]
        elif operator == '-':
            result -= args[i]
        elif operator == '*':
            result *= args[i]
        elif operator == '/':
            result /= args[i]
    return result

print(arithmetic_operations(1, 2, 3, 4, operator='+'))  ## 输出:10
print(arithmetic_operations(10, 3, 2, operator='-'))  ## 输出:5
print(arithmetic_operations(2, 3, 4, operator='*'))  ## 输出:24
print(arithmetic_operations(20, 4, operator='/'))  ## 输出:5.0

在这个例子中,arithmetic_operations() 函数可以使用 *args 接受任意数量的参数,并使用 operator 关键字参数指定所需的算术运算。

使用 *args 收集用户输入

假设你想创建一个函数,它可以收集任意数量的用户输入并将它们存储在一个列表中。

def collect_inputs(*args):
    user_inputs = []
    for arg in args:
        user_input = input(f"输入 {arg}:")
        user_inputs.append(user_input)
    return user_inputs

names = collect_inputs("姓名", "年龄", "城市")
print(names)
## 输出:
## 输入 姓名:LabEx
## 输入 年龄:30
## 输入 城市:纽约
## ['LabEx', '30', '纽约']

在这个例子中,collect_inputs() 函数使用 *args 接受任意数量的提示,然后收集用户的响应并将它们存储在一个列表中。

使用 **kwargs 的日志记录函数

想象一下,你想创建一个日志记录函数,它可以记录不同级别的消息(例如,调试、信息、警告、错误)并包含其他元数据。

def log_message(**kwargs):
    log_level = kwargs.get('level', 'info')
    message = kwargs['message']
    metadata = kwargs.get('metadata', {})

    print(f"[{log_level.upper()}] {message}")
    for key, value in metadata.items():
        print(f"  {key}: {value}")

log_message(level='debug', message='这是一条调试消息')
## 输出:
## [DEBUG] 这是一条调试消息

log_message(level='warning', message='发生了一些不寻常的事情', metadata={'用户': 'LabEx', '时间戳': '2023-04-18 12:34:56'})
## 输出:
## [WARNING] 发生了一些不寻常的事情
##   用户: LabEx
##   时间戳: 2023-04-18 12:34:56

在这个例子中,log_message() 函数使用 **kwargs 接受任意数量的关键字参数,包括日志级别、消息和可选的元数据。

总结

在本 Python 教程中,你已经学习了如何有效地结合使用 *args 和 **kwargs 来创建灵活且动态的函数调用。通过理解这两种技术之间的差异以及如何一起使用它们,你可以编写更强大、适应性更强的 Python 函数,以处理各种输入场景。这些知识将帮助你编写更高效、易于维护的代码,使你成为更熟练的 Python 程序员。