iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
Python

初學者的 30 天 Python 復健課程系列 第 24

復健第二十四天:刻意不想面對的高階函式 Higher Order Functions

  • 分享至 

  • xImage
  •  

在第十三天時,我們曾認識了程式語言中,至關重要的物件——函式 Function,然而我們僅僅是概略地學習如何創建與使用函式,似乎好像無法深刻體悟函式究竟可以多厲害,以及為什麽函式在眾多程式語言中,都有著舉足輕重的地位。

高階函式(Higher Order Functions)

今天要講的高階函式 Higher Order Functions 並非另一種形式的函式,而是函式在 Python 中是一種更高等級的存在,可以想像成「萬般皆下品,唯有函式高」的狀況,也因為這個狀況,函式也可以被稱作一等公民 First-class Citizen,一等公民所代表的意義,並非有數種其他不同等級的公民,而是意味著我們可以對函式這樣的一等公民對象進行以下操作:

  • 函式可以接受一個或多個函式作為參數
  • 函式可以作為另一個函式的返回值
  • 函式可以被修改
  • 函式可以被賦值給變數

函式作為參數

在 Python 中,我們可以將函式當作參數 parameter 傳遞給另一個函式。

# 一個普通的函式
def sum_numbers(nums):  
    return sum(nums)    # 使用內建的 sum 函式來計算總和

# 接受函式作為參數的高階函式
def higher_order_function(f, nums_list):  
    summation = f(nums_list)
    return summation

result = higher_order_function(sum_numbers, [1, 2, 3, 4, 5])
print(result)       # 15

在上面的範例中,我們可以看見 sum_numbers是一個用來進行加總的函式,最後會返回串列加總後的結果

接著來細看另一個名為 higher_order_function 的函式,它可以接收兩個參數,分別為 fnum_list,從內容中的 summation = f(nums_list) 來看,可以推斷 summation 這個變數被賦值了一個 f(num_list) 的函式,然後我們把 sum_numbers 跟串列 [1, 2, 3, 4, 5] 分別帶入到 fsummation 中,會發現 f(nums_list) 變成了 sum_numbers([1, 2, 3, 4, 5]),也就是調用了本來的 sum_numbers 函數。

在這個過程中,我們將 sum_numbers 函式作為參數傳遞給 higher_order_function,並使用該函式來計算數字列表的總和,最後計算串列 [1, 2, 3, 4, 5],得到結果 15

函式作為返回值

我們也可以讓函式返回另一個函式,這樣就可以根據條件來動態選擇和執行不同的函式。

def square(x):          # 一個平方函式
    return x ** 2

def cube(x):            # 一個立方函式
    return x ** 3

def absolute(x):        # 一個取絕對值的函式
    if x >= 0:
        return x
    else:
        return -(x)

def higher_order_function(type): # 一個高階函式,根據參數返回不同的函式
    if type == 'square':
        return square
    elif type == 'cube':
        return cube
    elif type == 'absolute':
        return absolute

result = higher_order_function('square')
print(result(3))       # 9
result = higher_order_function('cube')
print(result(3))       # 27
result = higher_order_function('absolute')
print(result(-3))      # 3

從上述範例中可以看到,高階函式會根據傳遞的參數來返回不同的函式。例如,當我們傳入 'square' 時,高階函式返回 square 函式,並將結果計算為 9;當傳入 'cube' 時,返回 cube 函式並計算為 27。

後記

一開始我覺得高階函式是困難的概念,它很像在變魔術,把東西左放右放,突然就得到了另外一個東西,而要真的理解高階函式,不外乎就是一步一步地代入,然後得到最終的結果。


上一篇
復健第二十三天:只有 Python 還不夠,看我召喚強力外援 PIP
下一篇
復健第二十五天:一開始有點難理解的閉包 closure
系列文
初學者的 30 天 Python 復健課程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言