这个问题在这里已有答案:
所以我对 *args
和 **kwargs
的概念有困难 .
到目前为止,我已经了解到:
-
*args
=参数列表 - 作为位置参数 -
**kwargs
= dictionary - 其键成为单独的关键字参数,值成为这些参数的值 .
我不明白这会对哪些编程任务有所帮助 .
也许:
我想输入列表和字典作为函数AND的参数同时作为通配符,所以我可以传递任何参数?
是否有一个简单的例子来解释如何使用 *args
和 **kwargs
?
我发现的教程也使用了“*”和变量名 .
是 *args
和 **kwargs
只是占位符还是在代码中使用 *args
和 **kwargs
?
11 回答
这是一个使用3种不同类型参数的示例 .
这是我最喜欢使用
**
语法的地方之一,如Dave Webb的最后一个例子:与仅使用名称本身相比,我不确定它是否非常快,但输入起来要容易得多!
想象一下你有一个功能,但你不想限制它所需的参数数量 . 例:
然后你使用这个函数,如:
名称
*args
和**kwargs
或**kw
纯粹是按惯例 . 它使我们更容易阅读彼此的代码一个方便的地方是使用struct模块
struct.unpack()
返回一个元组,而struct.pack()
使用可变数量的参数 . 在操作数据时,可以方便地将元组传递给struck.pack()
,例如 .如果没有这种能力,你将被迫写作
这也意味着如果format_str改变并且元组的大小发生变化,我将不得不返回并编辑那个真正的长行
您可以查看python docs(FAQ中的docs.python.org),但更具体地说是一个很好的解释the mysterious miss args and mister kwargs (courtesy of archive.org)(原始的,死链接是here) .
简而言之,当使用函数或方法的可选参数时,都使用它们 . 正如Dave所说,当你不知道可以传递多少个参数时会使用* args,而当你想要处理name和value指定的参数时会使用** kwargs,如:
并使用它:sumFunction(3,4,6,3,6,8,9) .
** kwargs有不同的功能 . 使用** kwargs,您可以为函数提供任意关键字参数,并且可以作为dictonary访问它们 .
调用someFunction(text =“foo”)将打印foo .
The syntax is the * and ** . 名称
*args
和**kwargs
仅按惯例,但没有硬性要求使用它们 .当你不确定可以向你的函数传递多少个参数时,你会使用
*args
,即它允许你向你的函数传递任意数量的参数 . 例如:同样,
**kwargs
允许您处理事先未定义的命名参数:您也可以将这些与命名参数一起使用 . 显式参数首先获取值,然后将其他所有内容传递给
*args
和**kwargs
. 命名参数在列表中排在第一位 . 例如:您也可以在同一个函数定义中使用它们,但
*args
必须在**kwargs
之前出现 .调用函数时,也可以使用
*
和**
语法 . 例如:正如您在本案中所看到的,它会获取项目的列表(或元组)并将其解包 . 通过它,它将它们与函数中的参数匹配 . 当然,您可以在函数定义和函数调用中使用
*
.这些参数通常用于代理函数,因此代理可以将任何输入参数传递给目标函数 .
但由于这些参数隐藏了实际的参数名称,因此最好避免使用它们 .
使用
*args
和**kwargs
非常有用的一个地方是子类化 .这样你就可以扩展Foo类的行为,而不必过多地了解Foo . 如果您正在编程可能会更改的API,这可能非常方便 . MyFoo只是将所有参数传递给Foo类 .
请注意,* args / ** kwargs是其中的一部分函数调用语法,而不是真正的运算符 . 这有一个特殊的副作用,我遇到了,你不能使用* args扩展与print语句,因为print不是一个函数 .
这似乎是合理的:
不幸的是它没有编译(语法错误) .
这编译:
但是将参数打印为元组,这不是我们想要的 .
这是我解决的解决方案: