为什么非默认参数不能遵循默认参数?
为什么这段代码抛出一个语法错误?
>>> def fun1(a="who is you", b="True", x, y): ... print a,b,x,y ... File "<stdin>", line 1 SyntaxError: non-default argument follows default argument
虽然下面的一段代码是正确的…
>>> def fun1(x, y, a="who is you", b="True"): ... print a,b,x,y ...
我正在学习编程,请耐心等待我….
所有必需的参数必须放在任何默认参数之前。 只是因为它们是强制性的,而默认参数则不是。 在语法上,如果允许混合模式,则解释器不可能决定哪些值匹配哪些参数。 如果没有以正确的顺序给出参数,则会引发SyntaxError
:
让我们看看关键字参数,使用你的function。
def fun1(a="who is you", b="True", x, y): ... print a,b,x,y
假设它允许像上面那样声明函数,那么使用上面的声明,我们可以进行下面的(常规的)位置或关键字参数调用:
func1("ok a", "ok b", 1) # Is 1 assigned to x or ? func1(1) # Is 1 assigned to a or ? func1(1, 2) # ?
如何在函数调用中build议赋值variables,如何使用默认参数以及关键字参数。
>>> def fun1(x, y, a="who is you", b="True"): ... print a,b,x,y ...
参考O'Reilly – 核心 – Python
在这个函数中,使用默认参数在语法上正确的用于上面的函数调用。 关键字参数调用被certificate对于能够提供乱序位置参数非常有用,但是,与默认参数一起,它们也可以用来“跳过”缺less的参数。
SyntaxError: non-default argument follows default argument
如果你允许这样做,那么缺省参数就会变得没有用处,因为你将永远无法使用它们的缺省值,因为非缺省参数在后面 。
但是,在Python 3中,您可以执行以下操作:
def fun1(a="who is you", b="True", *, x, y): pass
这使得只有x
和y
关键字,所以你可以这样做:
fun1(x=2, y=2)
这是有效的,因为不再有任何含糊之处。 注意你仍然不能做fun1(2, 2)
(这会设置默认参数)。
让我在这里清楚两点:
- 首先非默认参数不应该遵循默认参数,这意味着你不能在函数中定义(a = b,c)函数中定义参数的顺序是:
- 位置参数或非默认参数即(a,b,c)
- 关键字参数或默认参数ie(a =“b”,r =“j”)
- 关键字参数即(* args)
- var-keyword参数即(** kwargs)
def example(a, b, c=None, r="w" , d=[], *ae, **ab):
(a,b)是位置参数
(c = none)是可选参数
(r =“w”)是关键字参数
(d = [])是列表参数
(* ae)仅为关键字
(** ab)是var-keyword参数
- 现在次要的事情是,如果我尝试这样的事情:
def example(a, b, c=a,d=b):
当保存默认值时,参数没有被定义,Python在定义函数时计算并保存默认值
c和d没有定义,不存在,发生这种情况(只有在函数执行时才存在)
“a,a = b”在参数中是不允许的。
必需的参数(没有默认值的参数)必须在开始时允许客户端代码只提供两个参数。 如果可选参数是一开始就会令人困惑:
fun1("who is who", 3, "jack")
你的第一个例子会做什么? 最后,x是“谁是谁”,y是3,a =“杰克”。
它是由python参数parsing器的工作机制决定的。 这里没什么魔法。