Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 函数参数中是否有空星号?_Python_Python 3.x_Parameter Passing - Fatal编程技术网

Python 函数参数中是否有空星号?

Python 函数参数中是否有空星号?,python,python-3.x,parameter-passing,Python,Python 3.x,Parameter Passing,函数参数中的星号有什么作用 当我看到这张照片时,我看到: pickle.dump(obj, file, protocol=None, *, fix_imports=True) 我知道参数前面有一个或两个星号(用于可变数量的参数),但这不在任何参数之前。我很确定这和泡菜无关。这可能只是发生这种情况的一个例子。我是在给翻译发这封信时才知道它的名字的: >>> def func(*): ... pass ... File "<stdin>", line 1

函数参数中的星号有什么作用

当我看到这张照片时,我看到:

pickle.dump(obj, file, protocol=None, *, fix_imports=True)
我知道参数前面有一个或两个星号(用于可变数量的参数),但这不在任何参数之前。我很确定这和泡菜无关。这可能只是发生这种情况的一个例子。我是在给翻译发这封信时才知道它的名字的:

>>> def func(*):
...     pass
...
  File "<stdin>", line 1
SyntaxError: named arguments must follow bare *
>>定义函数(*):
...     通过
...
文件“”,第1行
SyntaxError:命名参数必须跟在bare后面*

如果重要的话,我使用的是Python3.3.0。

Bare
*
用于强制调用方使用命名参数-因此,当您没有以下关键字参数时,不能将带有
*
的函数定义为参数


有关更多详细信息,请参见或。

原始答案完全回答了问题,只是添加了一些相关信息。单个星号的行为源自。引用相关章节:

第二个语法变化是允许参数名
对于varargs参数,可以省略。这句话的意思是
对于不支持的函数,只允许使用关键字参数
否则,使用varargs参数:
def比较(a、b、*,键=无):
...
在简单的英语中,这意味着要传递key的值,您需要显式地将其作为
key=“value”
传递

上面带有**kwargs的示例

def func(*, a, b, **kwargs):
    print(a)
    print(b)
    print(kwargs)

func(a="aa",b="bb", c="cc") # aa, bb, {'c': 'cc'}

我发现以下链接非常有助于解释
*
*args
**kwargs

基本上,除了上面的答案,我还从上面的网站(学分:)学到了以下内容:

对于下面首先定义的演示函数,有两个示例,一个带有
*args
,另一个带有
**kwargs

def test_args_kwargs(arg1, arg2, arg3):
    print "arg1:", arg1
    print "arg2:", arg2
    print "arg3:", arg3

# first with *args
>>> args = ("two", 3,5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5

# now with **kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two","arg1":5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3
因此,
*args
允许您动态地构建参数列表,这些参数将按照输入的顺序获取,而
**kwargs
可以允许传递命名参数,并可以按名称进行相应的处理(无论输入的顺序如何)

该网站继续指出,正确的参数顺序应为:

some_func(fargs,*args,**kwargs)

假设你有一个函数:

def sum(a,key=5):
    return a + key 
您可以通过两种方式调用此函数:

sum(1,2)
sum(1,key=2)

假设您希望只使用关键字参数调用函数
sum

*
添加到函数参数列表中,以标记位置参数的结束

因此,功能定义为:

def sum(a,*,key=5):
    return a + key 

只能使用
sum(1,key=2)

调用。从语义上讲,这意味着它后面的参数仅为关键字,因此如果尝试提供参数而不指定其名称,则会出现错误。例如:

定义f(a,*,b): ... 返回a+b ... >>>f(1,2) 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:f()接受1个位置参数,但给出了2个 >>>f(1,b=2) 3. 实际上,这意味着您必须使用关键字参数调用函数。如果没有参数名称的提示,就很难理解参数的目的,则通常会执行此操作


比较例如
sorted(nums,reverse=True)
与编写
sorted(nums,True)
时的比较。后者的可读性要差得多,因此Python开发人员选择让您以前者的方式编写。

请注意,所有位置(未命名)参数,包括
*args
,都必须出现在裸露的
*
之前。还要注意,有一种对应的,/,它标志着仅位置参数的结束().@BallpointBen:
*
代替
*args
,反之亦然;它们不能共存于一个签名中。这就是为什么他们选择了
*
;以前,
*args
是强制使用纯位置参数的唯一方法,它标记了可以按位置传递的参数的结束(因为它收集了所有剩余的位置参数,它们可以到达以下命名参数)<代码>*表示相同的“位置参数不能超出此处”,但缺少名称表示“但我根本不会接受它们,因为我选择不提供放置它们的位置”。哦,这让事情更清楚了。所以,实际上有一个参数*就像有一个参数args*,但是由于你没有给它命名任何东西,它的唯一效果可能是悄悄地吞下所有剩余的位置参数,以便强制剩余的参数仅为关键字。@Stephen我最初也认为,bare
*
的作用是吞噬剩余的位置参数,但事实并非如此。传递超出函数预期的额外位置参数会导致此类错误:
foo()正好接受1个位置参数(2个给定)
我会在前面添加PEP示例“作为一种方便的快捷方式,我们可以省略'ignore'名称,意思是'不允许任何超出此点的位置参数'。”这个相当的例子清楚而具体地说明了它的作用。相关:这个答案几乎与这个问题无关。它甚至使用了一个过时的python版本,而这个版本没有这个特性。
def sum(a,*,key=5):
    return a + key