4. 用「*」接收多個positional引數

(1) 可接收多個positional引數

在函式的參數名稱之前加入「*」,該參數就可以接收多個引數值,傳入值將以tuple型態儲存。

以下是一個例子:

def average(*score):
    '''回傳平均成績'''   
    avg = sum(score) / len(score)         
    return avg

第1行中,*score代表參數score可接收多個值。

呼叫函式:

print(f'{average(80, 70, 60):.1f}分')
print(f'{average(90, 85, 86, 73):.1f}分')

在第1行中,80、70、60這3個引數將以(80, 70, 60)的tuple型態存在參數score中。

執行結果:

70.0分 83.5分

說明:

(2) 不同型態的參數一起使用

如果函式的參數除了有只接收1個值的參數,也有接收不定個數的引數的參數時,請將只接收1個值的參數寫在前面其後才寫接收不定個數引數的參數

以下是一個例子:

def average(passOral, *score):
    '''回傳平均成績'''   
    avg = sum(score) / len(score) 
    
    # 如果通過口語測驗, 平均加3分 
    if passOral:
        avg = min(avg+3, 100)
               
    return avg

在第1行,passOral只接收1個引數,請寫在前面;*score可接收多個引數,請寫在後面。

呼叫函式:

print(f'{average(True, 80, 70, 60):.1f}分')
print(f'{average(False, 90, 85, 86, 73):.1f}分')

執行結果:

73.0分 83.5分

說明:

問題1:

撰寫一個函式,名稱是teenager,接收不定個數的年齡資料。請計算並回傳傳入資料中有多少人的年齡介於13~19歲之間(包括13及19歲)。

測試範例:

teenager(10, 20, 15, 18, 21) -> 2 teenager(20, 30, 35, 5, 10, 10) -> 0

問題2:

撰寫一個函式,名稱是ticket,接收1個是否學生團體的參數,及不定個數的參與者年齡資料。假設學生團體的參與者18歲(含)以上每人200元,不足18歲每人120元;非學生團體的參與者18歲(含)以上每人250元,不足18歲每人180元。請計算並回傳票價。

測試範例(小數取2位):

ticket(True, 20, 21, 20, 15) -> 720元 ticket(False, 20, 21, 20, 21, 15, 12) -> 1,360元