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

繁華似錦Fighting發表於2022-01-07

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不能說是一個函數語言程式設計語言(用的不多知道就行)。

相關文章