Python函式參數所接收的引數(Argument),主要可以分成兩種,分別為位置引數(Positional Argument)和關鍵字引數(Keyword Argment),以下我們先來看個例子,說明什麼是位置引數
1 2 3 4 5
| def total_score(eng_score, math_score, eng_weight, math_weight): return eng_scoreeng_weight + math_scoremath_weight >>> total_score(80, 90, 0.5, 0.5) 85
|
假設今天我們寫了一個簡單的函式來計算小考的平均成績,共有英文和數學兩科,兩科各有一個權重比例來計算出綜合成績。這個函式要傳入4個引數,所以在呼叫時我們必須提供所有的引數(即4個),而傳入的引數會被設成相應位置上參數的值。
eng_score被設成80、eng_weight被設成0.2、math_score被設成90、math_weight被設成0.8,這就是位置引數
函式接收的參數,也可以指定一個預設值。假設預設的計算分數的權重都是固定一半一半,我們可以在函式撰寫時就給予一個預設的權重值。有預設值的參數為選用參數,在沒有傳入引數的情況下,python會使用預設值;而沒有預計值的參數為必要參數,在呼叫函式時必須傳入所有必要參數
1 2
| def total_score(eng_score, math_score, eng_weight=0.5, math_weight=0.5): return eng_scoreeng_weight + math_scoremath_weight
|
若要改變參數的預設值,我們也可以直接使用額外的位置引數,就可以取代原來的預設值,或者也可以使用關鍵字引數來傳遞引數。以下為幾個呼叫的範例:
1 2 3 4 5 6 7 8
| >>> total_score(80, 90) 85 >>> total_score(eng_score=80, eng_weight=0.2, math_score=90, math_weight=0.8) 88 >>> total_score(80, 90, math_weight=0.8, eng_weight=0.2) 88 >>> total_score(80, 90, 0.2, 0.8) 88
|
其中可以看到使用關鍵字引數的好處在於,關鍵字引數可以讓函式呼叫變得具彈性,即針對自己所需的選用參數來指定引數;甚至也可以讓函式呼叫更加具可讀性,特別在傳入布林引數時。例如在排序時決定要不要作逆向排序,sorted(text, reverse=True)比起sorted(text, True)可讀性來的更高
有兩個要注意的地方,第一個是函式語法不允許具預設值的參數之後接非預設值的參數,會引發SyntaxError。例如:
1 2
| def total_score(eng_score, eng_weight=0.5, math_score, math_weight=0.5): >>> SyntaxError
|
再來是傳入函式的引數,若是位置引數和關鍵字引數混用的話,位置引數務必放在關鍵字引數的前面,否則也是會引發SyntaxError。所以total_score(math_weight=0.8, eng_weight=0.2, 80, 90)是不行的