1. 程式人生 > 程式設計 >詳解Python高階函式

詳解Python高階函式

本文要點

1.什麼是高階函式

2.python中有哪些常用的高階函式

什麼是高階函式?

在瞭解什麼是高階函式之前,我們來看幾個小例子。我們都知道在 python 中一切皆物件,函式也不例外。比如求絕對值函式 abs,我們可以用一個變數 f 指向 abs 函式,那麼當呼叫 f() 的時候可以得到和 abs() 一樣的效果,這說明變數可以指向函式!

詳解Python高階函式

同理我們將 abs 指向另一個函式 abs = len,那麼 abs 將不再是求絕對值的函數了,abs指向的是求長度的 len 函式。這說明函式名其實就是指向函式的變數!

詳解Python高階函式

既然變數可以指向函式,而函式的引數可以接收變數。也就是說一個函式可以接收另一個函式作為引數。下面我們來看一個DEMO。定義一個 add 函式,它接受三個引數 x,y,f,其中 x,y 是數字,f 是一個函式。

def add(x,f):
  return f(x) + f(y)

result = add(-12,-98,abs)
print(result)

輸出結果:110

上面的 add() 函式就是一個高階函式,其實高階函式的概念很簡單,能接收函式作引數的函式就是高階函式。

python中常用的高階函式

1.map()

map() 是 Python 內建的高階函式,它接收一個函式 f 和一個 list,並通過把函式 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。

例如,對於 list [1,2,3,4,5,6,7,8,9]

如果希望把 list 的每個元素都作平方,就可以用 map()

函式:

因此,我們只需要傳入函式 f(x)=x * x,就可以利用 map() 函式完成這個計算:

def add(x,abs)
print(result)

輸出結果:

[1,9,16,25,36,49,64,81]

注意:map() 函式不改變原有的 list,而是返回一個新的 list。

由於 list 包含的元素可以是任何型別,因此,map() 不僅僅可以處理只包含數值的 list,事實上它可以處理包含任意型別的 list,只要傳入的函式f可以處理這種資料型別。

2.reduce()

reduce() 函式接收的引數和 map() 類似,一個函式 f,一個 list,但行為和 map() 不同,reduce() 傳入的函式 f 必須接收兩個引數,reduce() 對 list 的每個元素反覆呼叫函式 f,並返回最終結果值。

下面我們來看個 demo:

def prod(x,y):
 return x * y


print(reduce(prod,[2,12]))

輸出結果:3360

prod() 函式接收兩個引數,返回 x 和 y 的乘積

呼叫 reduce(prod,12]) 時,reduce 函式將做如下計算:

先計算頭兩個元素prod(2,4)結果為:8,

再把計算結果和第3個元素傳給 prod(8,5) 結果為:40,

再把計算結果和第4個元素傳給 prod(40,7) 結果為:280,

再把計算結果和第5個元素傳給 prod(280,12) 結果為:3360,

由於沒有更多元素了,最終返回結果:3360

reduce() 還可以接收第 3 個可選引數,作為計算的初始值。如果把初始值設為 100,計算:

reduce(prod,12],100)

結果變為:336000,因為第一輪的計算是:

計算初始值和第一個元素:prod(100,2),結果為:200。

3.filter()

filter() 又可以叫做過濾函式,它接收一個函式 f 和一個 list,這個函式 f 的作用是對每個元素進行判斷,返回 True 或 False,filter() 根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新 list。

例如,要從一個 list [1,12,17]中刪除偶數,保留奇數,首先,要編寫一個判斷奇數的函式:

def is_odd(x):

 if x % 2 == 1:
 return x

然後用 filter() 過濾掉偶數:

print(list(filter(is_odd,[1,17])))

結果:[1,17]

利用 filter(),可以完成很多有用的功能,例如,刪除 None 或者空字串:

def is_not_empty(s):
 return s and len(s.strip()) > 0

print(list(filter(is_not_empty,['test',None,'','str',' ','END'])))

以上就是詳解Python高階函式的詳細內容,更多關於Python高階函式的資料請關注我們其它相關文章!