3 回答

TA貢獻1770條經驗 獲得超3個贊
必須將所有必需的參數放在任何默認參數之前。僅僅是因為它們是強制性的,而默認參數不是必需的。從語法上講,如果允許使用混合模式,則解釋器將無法決定哪些值與哪些參數匹配。SyntaxError如果參數的輸入順序不正確,則會引發A :
讓我們使用您的函數來查看關鍵字參數。
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) # ?
您將如何建議在函數調用中分配變量,如何將默認參數與關鍵字參數一起使用。
>>> def fun1(x, y, a="who is you", b="True"):
... print a,b,x,y
...
參考O'Reilly-Core-Python
其中,此函數在語法上正確地使用了上述函數調用的默認參數。事實證明,關鍵字參數調用對于提供亂序的位置參數很有用,但是與默認參數結合使用,它們也可以用于“跳過”缺少的參數。

TA貢獻1773條經驗 獲得超3個贊
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)(這將設置默認參數)。

TA貢獻1810條經驗 獲得超4個贊
讓我在這里澄清兩點:
首先,非默認參數不應跟隨默認參數,這意味著您無法在函數中定義(a = b,c),而在函數中定義參數的順序為:
位置參數或非默認參數,即(a,b,c)
關鍵字參數或默認參數,即(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”不允許使用。
添加回答
舉報