7. 同時用「*」及「**」接收引數

同時用「*」接收不定個數的引數及「**」接收不定個數的指定名稱的引數時,請將「*」型態的參數寫在前面,「**」型態的參數寫在後面

以下是一個例子:

假設學生可以考若干的基礎科目,每通過一科得2學分;加選科目如果是國文、英文、數學、程式其中之一,每通過一科得3學分;其他科目不論是否及格均不算學分。

def credit(*basic, **addition):
    '''回傳學分數'''
    # 基礎科目可得學分數
    basicCredit = len([k for k in basic if k>=60]) * 2
    
    # 加選科目可得學分數
    additionCredit = len([k for k in addition if k in ('國文', '英文', '數學', '程式') and addition[k]>=60]) * 3
    
    return basicCredit + additionCredit

在第1行,用*basic接收多個引數值,並且用**addition接收多個指定參數的引數值。

呼叫函式:

print(f'{credit(60, 80, 55, 國文=90, 英文=50)}')
print(f'{credit(50, 40, 30, 55, 地理=90, 生物=100)}')

在第1行,指定將(60, 80, 55)傳給參數basic;將{國文:90, 英文:50}傳給參數addition。

執行結果:

7 0

說明:

問題:

撰寫一個函式,result(*num, **limit),可回傳「計算後的數值」。它先接收不定個數的數值資料,再接收「上限值(upbound)」、「下限值(lowbound)」等兩種「限制=值」的指定名稱引數(最多只有2個)。如果未指定下限值,則下限值=0;如果未指定上限值,則上限值=100。請回傳介於上、下限之間的不定個數的數值資料之總和。

測試範例:

result(10, 20, 30, 40, 50, 60, upbound=50, lowbound=25) -> 120 (30,40,50介於25~50之間) result(25, 45, 85, 125, lowbound=55) -> 85 (只有85介於55~100之間) result(125, 245, 385, 425, 555) -> 0 (沒有數值介於0~100之間) result(35, 65, 85, 100, upbound=70) -> 100 (35和65介於0~70之間)