在 Python 中,*args**kwargs 是特殊的语法,允许你在函数定义中接收不定数量的位置参数和关键字参数。这些参数通常用于当你不知道函数需要接受多少个参数时,或者当参数的数量可能变化时。

  • *args 允许你传递任意数量的位置参数给函数,并且这些参数会被收集到一个元组中。
  • **kwargs 允许你传递任意数量的关键字参数给函数,并且这些参数会被收集到一个字典中。

下面是一个简单的例子来展示它们的用法:

def example_function(arg1, arg2, *args, kwarg1=None, kwarg2=None, **kwargs):
    print(f"Required arguments: {arg1}, {arg2}")
    print(f"Additional positional arguments: {args}")
    print(f"Keyword argument kwarg1: {kwarg1}")
    print(f"Keyword argument kwarg2: {kwarg2}")
    print(f"Additional keyword arguments: {kwargs}")
 
# 调用函数
example_function('Hello', 'World', 'Extra', 'Arguments', kwarg1='Value1', kwarg2='Value2', ExtraKwarg='MoreInfo')

在这个例子中:

  • arg1arg2 是必需的参数。
  • *args 收集了额外的位置参数,这里收集了 'Extra''Arguments'
  • kwarg1kwarg2 是具有默认值的关键字参数。
  • **kwargs 收集了额外的关键字参数,这里收集了 ExtraKwarg='MoreInfo'

使用示例

让我们实际运行一下这个函数来看看它的输出是什么样的。函数调用的输出如下:

Required arguments: Hello, World
Additional positional arguments: ('Extra', 'Arguments')
Keyword argument kwarg1: Value1
Keyword argument kwarg2: Value2
Additional keyword arguments: {'ExtraKwarg': 'MoreInfo'}

这表明:

  • 必需的参数 arg1arg2 被正确打印出来了。
  • 额外的位置参数 'Extra''Arguments)' 被打包进了 args 元组中。
  • 关键字参数 kwarg1kwarg2 被赋予了传入的值 'Value1''Value2'
  • 额外的关键字参数 ExtraKwarg='MoreInfo' 被收集到了 kwargs 字典里。

这样,*args**kwargs 就使得函数能够灵活地处理可变数量的参数。这种灵活性在编写需要接受不确定数量参数的函数时非常有用,比如装饰器或者一些工具函数。