詳解Python高階函式
本文要點
1.什麼是高階函式
2.python中有哪些常用的高階函式
什麼是高階函式?
在瞭解什麼是高階函式之前,我們來看幾個小例子。我們都知道在 python 中一切皆物件,函式也不例外。比如求絕對值函式 abs,我們可以用一個變數 f 指向 abs 函式,那麼當呼叫 f() 的時候可以得到和 abs() 一樣的效果,這說明變數可以指向函式!
同理我們將 abs 指向另一個函式 abs = len,那麼 abs 將不再是求絕對值的函數了,abs指向的是求長度的 len 函式。這說明函式名其實就是指向函式的變數!
既然變數可以指向函式,而函式的引數可以接收變數。也就是說一個函式可以接收另一個函式作為引數。下面我們來看一個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高階函式的資料請關注我們其它相關文章!