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

掌握 Python 中的 *args 和 **kwargs。了解如何使用动态位置和关键字参数编写灵活的函数、解包集合以及构建包装函数。

在编辑器中尝试此解决方案

概述

在 Python 中,您经常需要设计可以接受可变数量参数的函数。例如,计算任意数量整数之和的函数,或记录具有不同字段的元数据的函数。 Python 不强制用户传递列表或字典,而是提供了两个特殊符号:“*args”和“**kwargs”。

`*args` 语法允许函数接受任意数量的位置参数。单个星号“*”充当解包运算符。当放置在函数定义中时,它将额外的位置参数收集到名为“args”的元组中。这使您可以迭代输入值、运行计算或轻松地将它们传递给另一个函数。

另一方面,“**kwargs”语法允许函数接受任意数量的关键字(命名)参数。双星号“**”将这些参数收集到名为“kwargs”的字典中。这对于传递可选配置、样式参数或数据库属性非常有用。请记住,名称“args”和“kwargs”是约定;实际功能由单星号和双星号驱动。

代码和执行输出

此代码演示了使用 *args 来求和变量数,使用 **kwargs 来打印用户配置文件,以及将两者组合在一个函数中。

args_kwargs.py
在编辑器中尝试
def sum_all(*args):
    print("args type:", type(args).__name__)
    return sum(args)

print("Sum (1, 2, 3):", sum_all(1, 2, 3))
print("Sum (10, 20):", sum_all(10, 20))

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

print_profile(name="Bob", role="developer", country="US")

def master_function(first, *args, **kwargs):
    print(f"First argument: {first}")
    print(f"Additional positional args: {args}")
    print(f"Keyword args: {kwargs}")

master_function("hello", 1, 2, 3, debug=True, user_id=42)
端子输出
args type: tuple
Sum (1, 2, 3): 6
args type: tuple
Sum (10, 20): 30
kwargs type: dict
name: Bob
role: developer
country: US
First argument: hello
Additional positional args: (1, 2, 3)
Keyword args: {'debug': True, 'user_id': 42}

逐步实施

  • 在参数前使用单个星号(例如,*args)将位置参数收集到元组中。
  • 在参数前使用双星号(例如 **kwargs)将关键字参数收集到字典中。
  • 保持正确的参数顺序:标准参数、*args、仅关键字参数,然后是 **kwargs。
  • 通过传递 *iterable 或 **dictionary 来调用函数时使用解包语法。

常见问题解答

我必须使用名称“args”和“kwargs”吗?

不,这些是标准的社区惯例。仅 * 和 ** 前缀在语法上是必需的。您可以编写 *values 和 **options,但强烈建议坚持使用 *args 和 **kwargs 以提高可读性。

定义函数时正确的顺序是什么?

函数签名中参数的正确顺序是:位置参数、*args、仅关键字参数,最后是 **kwargs。

相关主题

推荐的 Python 资源

通过相关的交互式教程、备忘单和代码比较来扩展您的知识。