关于参数:python中的*args和**args的区别?

difference bewteen *args and **args in python?

本问题已经有最佳答案,请猛点这里访问。

我试图理解在Python中函数定义中,*args和**args之间的区别。在下面的示例中,*args将打包成一个元组并计算和。

1
2
3
4
5
6
7
8
9
10
>>> def add(*l):
... sum = 0
... for i in l:
... sum+=i
... return sum ...
>>> add(1,2,3)
6
>>> l = [1,2,3]
>>>add(*l)
6

对于**,

1
2
3
4
5
6
7
8
>>> def f(**args):
...     print(args)
...
>>> f()
{}
>>> f(de="Germnan",en="English",fr="French")
{'fr': 'French', 'de': 'Germnan', 'en': 'English'}
>>>

我看到它接受参数并将其转换成字典。但我不理解实用程序或其他在使用**参数时可能有用的东西。实际上,我不知道什么是*args和**args(vararg和?)

谢谢


当你使用两个星号时,你通常称它们为**kwargs作为关键字参数。它们对于在大型程序中将参数从一个函数传递到另一个函数非常有用。

关键字参数的一个好处是,修改代码非常容易。假设在下面的示例中,您还决定了参数cube也是相关的。您唯一需要做的就是在my_func_2中添加一个if statement,并且您不需要向调用my_func_2的每个函数添加参数(只要函数具有**kwargs)。

下面是一个简单而愚蠢的例子,但我希望它能有所帮助:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def my_func_1(x, **kwargs):
    if kwargs.get('plus_3'):
        return my_func_2(x, **kwargs) + 3
    return my_func_2(x, **kwargs)

def my_func_2(x, **kwargs):
    #Imagine that the function did more work
    if kwargs.get('square'):
        return x ** 2
    # If you decided to add cube as a parameter
    # you only need to change the code here:
    if kwargs.get('cube'):
        return x ** 3
    return x

演示:

1
2
3
4
5
6
7
8
>>> my_func_1(5)
5
>>> my_func_1(5, square=True)
25
>>> my_func_1(5, plus_3=True, square=True)
28
>>> my_func_1(5, cube=True)
125