11. 傳遞函式物件

(1) 將函式的參照複製給一個變數

以下是一個例子:

def diff(data):
    if not (isinstance(data, list) or isinstance(data, tuple)):
        raise TypeError('只接收list或tuple型態')
    
    if len(data)==0:
        raise ValueError('需要有資料')
    
    return max(data) - min(data)

#-----------------------------------
print(diff([10, 3, 20]))

b = diff  #將函式diff的參照複製給b
print(b([10, 3, 20]))  #呼叫同一個函式

第13行,函式diff的參照複製給b,因此diff及b指向同一個函式物件。

執行結果:

17 17 0x21af985ef70 0x21af985ef70

說明

(2) 將函式的參照當作引數傳遞

以下是一個例子:

第16行,將op_1函數的位址傳給diff的參數op。 第17行,將op_2函數的位址傳給diff的參數op。

執行結果:

19 12.666666666666664

說明:

問題:

寫一個夏季電費函式summer(degree),計算並回傳電費,各分段收費如下。電費以不同分段之標準收費,如使用電費500度,則前300度每度3.02元,後200度每度5.44元。

寫一個冬季電費函式winter(degree),計算並回傳電費,各分段收費如下。電費以不同分段之標準收費,如使用電費500度,則前300度每度2.98元,後200度每度4.86元。

寫一個電費函式elecFee(degree, calculator),傳入用電度數及計費函式(夏季或冬季),計算並回傳電費,小數無條件進位。

測試主程式:

測試結果範例:

6,200元 3,934元 2,194元 1,514元 650元 6,106元 3,902元 2,066元 1,459元 641元