差异bewteen*args和**args在python中?

eag*_*arn 4 python parameters arguments decorator

我试图理解python中函数定义中*args和**args之间的区别.在下面的示例中,*args用于打包到元组并计算总和.

>>> 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
Run Code Online (Sandbox Code Playgroud)

对于**args,

>>> def f(**args):
...     print(args)
... 
>>> f()
{}
>>> f(de="Germnan",en="English",fr="French")
{'fr': 'French', 'de': 'Germnan', 'en': 'English'}
>>> 
Run Code Online (Sandbox Code Playgroud)

我看到它需要参数并变成字典.但我不明白使用**args时可能有用的实用程序或其他东西.事实上,我不知道*args和**args被称为什么(vararg和?)

谢谢

Aka*_*all 9

当您使用两个星号时,通常会将它们称为**kwargs关键字参数.它们对于在大型程序中从函数传递参数非常有帮助.

关键字参数的一个好处是,修改代码非常容易.让我们说在下面的例子中你也确定参数cube也是相关的.你需要做的唯一的事情就是添加一个if statementmy_func_2,你不会需要一个参数添加到被调用各项功能my_func_2,(只要该功能有**kwargs).

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

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
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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
Run Code Online (Sandbox Code Playgroud)