【问题标题】:difference bewteen *args and **args in python? [duplicate]python中*args和**args的区别? [复制]
【发布时间】:2013-09-16 05:05:06
【问题描述】:

我试图理解 *args 和 **args 在 python 中的函数定义中的区别。在下面的示例中,*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

对于 ** 参数,

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

我看到它接受参数并变成字典。但我不理解使用 ** args 时可能有用的实用程序或其他东西。其实我也不知道 *args 和 **args 叫什么(vararg and ?)

谢谢

【问题讨论】:

  • 对于“我不知道 *args 和 **args 叫什么”:那是因为没有真正的正式名称。术语“var-positional parameter”和“var-keyword parameter”在文档和源代码中的一些地方使用; PEP3102 使用“vararg 参数槽”和“关键字字典参数槽”。但那些并没有真正脱口而出。人们通常会说“varags 参数”和“kwargs 参数”之类的东西。
  • 我强烈推荐阅读official tutorial。特别是对于这个问题,它在(somewhat) advanced function definitions 上有一个完整的部分。但实际上,整个教程都很好。
  • 另外,“我看到它接受参数并变成字典”是错误的。它接受 (keyword) arguments 并将它们转换为字典,然后传递给单个 kwargs 参数。您通常可以摆脱对参数和参数的松散,但是在这方面您会感到困惑。 This blog post 试图解释它(并链接到更好的解释)。
  • 最后,你首先了解关键字参数的意义吗?因为这是这个问题的 90% 的答案。 *args 获取所有多余的位置参数; **kwargs 获取所有多余的关键字参数。

标签: python parameters arguments decorator


【解决方案1】:

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

关键字参数的一个好处是修改代码非常容易。假设在下面的示例中,您还决定参数 cube 也是相关的。您唯一需要做的就是在my_func_2 中添加一个if statement,并且您不需要为每个调用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

演示:

>>> 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

【讨论】:

  • 可以用一个简单的例子来演示一下吗?
  • 这是一个非常简单的理解示例。谢谢
猜你喜欢
  • 2020-11-08
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 2014-02-22
  • 1970-01-01
  • 2014-09-03
  • 1970-01-01
相关资源
最近更新 更多