跳转至

*args**kwargs

*args**kwargs主要用于函数的定义。当函数的参数不确定时,可以使用*args**kwargs来将不 定数量的参数传递给一个函数。这里不定的意思是预先并不知道函数的使用者会传递多少个参数,所以, 在这种场景下可以使用这两个关键字。

*args是用来发送一个非键值对的可变数量的参数列表给一个函数。*args会接收任意多个参数并把 这些参数作为元组传递给函数。*args没有key值,以元组形式传递。

**kwargs存储可变的关键字参数,允许使用没有事先定义的参数名,将接收到任意多个关键字参数 作为字典传递给函数。**kwargs有key值,以字典形式传递。

需要注意的是,函数的参数的顺序:*args必须在**kwargs前面,调用函数传递参数也必须依照此顺序。

(1) *args 示例

def demo(args_f,*args_v):
    print(args_f)
    for x in args_v:
        print(x,end='')
demo(1,'a','b','c','d')

运行结果:

1
abcd

再例如:

def function(x,y,*args):
    print(x,y,args)

function(1,2,3,4,5)

运行结果:

1 2 (3, 4, 5)

(2) **kwargs 示例

def demo(**kwargs):
    for k,v in kwargs.items():
        print(k,v)
demo(name='aaa')

运行结果:

name aaa

再例如:

def function(**kwargs):
    print(kwargs,type(kwargs))

function(a=2)

运行结果:

{'a': 2} <class 'dict'>

在 Python 中,*args**kwargs 是用于定义函数时的一种灵活参数机制。它们的主要作用是允许函数接收任意数量的参数。

1. *args

  • 含义:
    *args 是一个用于接收位置参数的可变参数列表。
    当函数调用时,传递的所有额外位置参数都会被收集到一个元组中。

  • 用法:
    通常用于函数参数数量未知,或需要对多个位置参数进行统一处理的场景。

  • 示例:

def demo_args(*args):
    print(args)  # args 是一个元组

demo_args(1, 2, 3)  # 输出: (1, 2, 3)
demo_args("a", "b", "c", "d")  # 输出: ('a', 'b', 'c', 'd')
  • 应用场景:
  • 构建函数能接收任意数量的参数。
  • 迭代处理多参数。

2. **kwargs

  • 含义:
    **kwargs 是用于接收关键字参数的可变参数字典。
    所有额外的关键字参数会被收集到一个字典中。

  • 用法:
    通常用于函数参数的关键字对数量未知,或需要对多个关键字参数进行统一处理的场景。

  • 示例:

def demo_kwargs(**kwargs):
    print(kwargs)  # kwargs 是一个字典

demo_kwargs(a=1, b=2, c=3)  # 输出: {'a': 1, 'b': 2, 'c': 3}
demo_kwargs(name="Alice", age=30)  # 输出: {'name': 'Alice', 'age': 30}
  • 应用场景:
  • 灵活处理配置项。
  • 动态生成参数列表。

3. 混合使用 *args**kwargs

  • 规则:
  • *args 必须出现在参数列表中 **kwargs 之前。
  • 位置参数在关键字参数之前。

  • 示例:

def demo_mixed(a, b, *args, **kwargs):
    print("a:", a)
    print("b:", b)
    print("args:", args)
    print("kwargs:", kwargs)

demo_mixed(1, 2, 3, 4, 5, name="Alice", age=30)
# 输出:
# a: 1
# b: 2
# args: (3, 4, 5)
# kwargs: {'name': 'Alice', 'age': 30}

4. 解包(Unpacking)

  • *** 的解包功能: 它们可以在函数调用时,将序列或字典中的值展开为独立的参数。

  • 示例:

def demo_unpack(a, b, c):
    print(a, b, c)

# 使用 * 解包列表/元组
args = (1, 2, 3)
demo_unpack(*args)  # 输出: 1 2 3

# 使用 ** 解包字典
kwargs = {"a": 4, "b": 5, "c": 6}
demo_unpack(**kwargs)  # 输出: 4 5 6

总结

  • *args 用于接收任意数量的位置参数,存储为元组。
  • **kwargs 用于接收任意数量的关键字参数,存储为字典。
  • 它们让函数更灵活,适合多参数和动态参数传递的场景。