【发布时间】: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