为什么非默认参数不能遵循默认参数?

为什么这段代码抛出一个语法错误?

>>> 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 

这使得只有xy关键字,所以你可以这样做:

 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器的工作机制决定的。 这里没什么魔法。