0%

位置引數(Positional Argument)與關鍵字引數(Keyword Argument)

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)是不行的