函数参数中的星号有什么作用?
当我查看pickle模块时,我看到了以下内容:
pickle.dump(obj, file, protocol=None, *, fix_imports=True)
我知道在parameters前面有一个或两个星号(用于参数数量可变的情况),但是这个星号前面什么都没有,而且我很确定这和pickle没有关系,这可能只是一个例子,我只是在把它发送给解释器的时候才知道它的名字:
>>> def func(*):
... pass
...
File "<stdin>", line 1
SyntaxError: named arguments must follow bare *
如果有关系的话,我用的是python 3.3.0。
6条答案
按热度按时间wbrvyc0a1#
裸
*
用于强制调用方使用命名参数-因此,如果没有以下关键字参数,则不能将*
作为参数来定义函数。更多细节请参见this answer或Python 3文档。
t3irkdon2#
原始答案完全回答了这个问题,只是添加了一些相关信息。单个星号的行为源自
PEP-3102
。引用相关部分:用简单的英语来说,它意味着要传递key的值,您需要显式地将其作为
key="value"
传递。fcg9iug33#
上面带有**kwargs示例
zxlwwiss4#
从语义上讲,它意味着它后面的参数是仅关键字,因此如果您试图提供一个参数而不指定其名称,则会收到错误。例如:
实际上,这意味着你必须用一个关键字参数来调用函数,这通常是在没有参数名的提示就很难理解参数的用途的时候。
例如,比较一下
sorted(nums, reverse=True)
和如果你写sorted(nums, True)
,后者的可读性要差得多,所以Python开发人员选择让你用前一种方式来写。aor9mmx15#
假设你有函数:
可以通过两种方式调用此函数:
sum(1,2)
或sum(1,key=2)
假设您希望仅使用关键字参数调用函数
sum
。将
*
添加到函数参数列表中,以标记位置参数的结束。因此函数定义为:
只能使用
sum(1,key=2)
调用qojgxg4l6#
我发现下面的链接非常有助于解释
*
、*args
和**kwargs
:https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/
基本上,除了上面的答案,我还从上面的网站(信用:https://pythontips.com/author/yasoob008/)以下各项:
对于下面首先定义的演示函数,有两个示例,一个使用
*args
,另一个使用**kwargs
因此,
*args
允许动态构建一个参数列表,这些参数将按照它们的输入顺序被接受,而**kwargs
可以允许传递NAMED参数,并且可以由NAME相应地处理(不管它们的输入顺序如何)。该网站继续指出,正确的参数顺序应该是: