📜  带有* args和** kwargs的Python中的可变长度参数(1)

📅  最后修改于: 2023-12-03 15:09:43.342000             🧑  作者: Mango

带有*args和**kwargs的Python中的可变长度参数

在Python中,我们可以定义不确定数量的参数,包括位置参数和关键字参数。这些参数被称为可变长度参数。其中,*args被用来传递不确定数量的位置参数,而**kwargs被用来传递不确定数量的关键字参数。下面我们将详细介绍这两种可变长度参数的使用方法。

位置参数

可变长度的位置参数用*args来表示。这种参数将会接受多个任意位置参数,并将它们打包成一个元组(tuple)。例如:

def my_sum(*args):
    total = 0
    for num in args:
        total += num
    return total

print(my_sum(1, 2, 3)) # 输出6
print(my_sum(1, 2, 3, 4)) # 输出10

在上面的例子中,*args接受任意个参数,并打包成一个元组,代表着1,2,3或1,2,3,4。使用for循环将args中的所有元素相加。

关键字参数

可变长度的关键字参数用**kwargs来表示。这种参数将会接受任意个关键字参数,并将它们打包成一个字典(dict)。例如:

def my_dict(**kwargs):
    my_dict = {}
    for k, v in kwargs.items():
        my_dict[k] = v
    return my_dict

print(my_dict(a=1, b=2, c=3)) # 输出{'a': 1, 'b': 2, 'c': 3}

在上面的例子中,**kwargs接受任意个关键字参数,并将它们打包成一个字典(dict),代表着{'a': 1, 'b': 2, 'c': 3}。我们使用for循环将kwargs中的键值对添加到一个新创建的空字典中。

组合使用

可以同时在函数定义中使用*args**kwargs,在这种情况下,位置参数必须在关键字参数的前面。例如:

def my_func(foo, bar, *args, **kwargs):
    # 使用位置参数foo和bar
    print('foo:', foo)
    print('bar:', bar)

    # 使用位置参数之后的位置参数
    for i, arg in enumerate(args):
        print('arg{}:'.format(i), arg)

    # 使用关键字参数
    for k, v in kwargs.items():
        print('kwarg{}:'.format(k), v)

# 测试myfunc
my_func('Hello', 'world', 101, 202, 303, a=1, b=2, c=3)

输出:

foo: Hello
bar: world
arg0: 101
arg1: 202
arg2: 303
kwarga: 1
kwargb: 2
kwargc: 3

在上面的例子中,我们首先使用了两个位置参数:foobar。然后我们使用了*args来接受101,202和303,使用for循环遍历元组中的所有元素。最后,我们使用**kwargs来接受关键字参数a,b和c,遍历字典中的所有键值对。

在大多数情况下,我们稍微困惑这两个可变长度参数在实际中的使用,但是,在编写接口文档或者重载已经存在的代码时,就会使用到这两个可变长度参数的功效了。