『無為則無心』Python函數 — 33、高階函數

1、高階函數的定義

把函數作為參數傳入(把一個函數作為另外一個函數的參數),或者將一個函數作為返回值的函數(閉包),這樣的函數稱為高階函數,滿足其一即可。

高階函數是函數式編程的體現,函數式編程就是指這種高度抽象的編程範式。

2、體驗高階函數

在Python中,abs()函數可以完成對數字求絕對值計算。

abs(-10)  # 10

round()函數可以完成對數字的四捨五入計算。

round(1.2)  # 1
round(1.9)  # 2

需求:任意兩個數字,按照指定要求整理數字後再進行求和計算。

  • 方法1
def add_num(a, b):
    return abs(a) + abs(b)

result = add_num(-1, 2)
print(result)  # 3
  • 方法2
# 高階函數:第三個參數f接收的是要給函數名,用來接收將來傳入的函數
# 如果我傳入絕對值方法,就按絕對值整理數值
# 如果我傳入四捨五入方法,就按四捨五入整理數值
def sum_num(a, b, f):
    return f(a) + f(b)

result = sum_num(-1, 2, abs)
print(result)  # 3

"""
我們也可以自定義函數,代替abs參數。
"""

注意:兩種方法對比之後,發現,方法2的程式碼會更加簡潔,函數靈活性更高。

函數式編程大量使用函數,減少了程式碼的重複,因此程式比較短,開發速度較快。

3、內置高階函數

(1)map()函數

map(func, lst),將傳入的函數變數func作用到lst變數的每個元素中,並將結果組成新的列表(Python2)/迭代器(Python3)返回。

換句話說就是,map()函數可以對可跌倒對象中的所有元素做指定的操作,然後將其添加到一個新的對象中返回。

需求:計算list1序列中各個數字的2次方。

# 1. 準備列表數據
list1 = [1, 2, 3, 4, 5]

# 2. 準備2次方計算的函數
def func(x):
    return x ** 2

# 3. 調用map
result = map(func, list1)

# 4. 驗收成果
print(result)  # <map object at 0x0000013769653198>
print(list(result))  # [1, 4, 9, 16, 25]

(2)reduce()函數

reduce(func,lst),其中func必須有兩個參數。每次func計算的結果繼續和序列的下一個元素做累積計算。

注意:reduce( )傳入的參數func必須接收2個參數。

需求:計算list1序列中各個數字的累加和。

# 導入模組
import functools

list1 = [1, 2, 3, 4, 5]

def func(a, b):
    return a + b

# 調用reduce,作用:功能函數計算的結果和序列的下一個數據做累計計算
result = functools.reduce(func, list1)

print(result)  # 15

(3)filter()函數

filter(func, lst)函數用於過濾序列, 過濾掉不符合條件的元素, 返回一個filter對象。如果要轉換為列表, 可以使用list( )來轉換。

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 定義功能函數:過濾序列中的偶數
def func(x):
    return x % 2 == 0

# 調用filter
result = filter(func, list1)

print(result)  # <filter object at 0x0000017AF9DC3198>
print(list(result))  # [2, 4, 6, 8, 10]

Python支援函數式編程,但Python不能說是一個函數式程式語言(用的不多知道就行)。