什么是高階函數(shù)泳猬?
把函數(shù)作為參數(shù)傳入盒揉,這樣的函數(shù)稱為高階函數(shù)田藐,函數(shù)式編程就是指這種高度抽象的編程范式荔烧。
map()函數(shù)
map()
函數(shù)接收兩個參數(shù),一個是函數(shù)坞淮,一個是Iterable
茴晋,map
將傳入的函數(shù)依次作用到序列的每個元素陪捷,并把結(jié)果作為新的Iterator
返回回窘。
舉例:
my_list = [2, 3, 5, 7, 9]
def f(x):
return x * x
print(list(map(f, my_list)))
# 輸出:[4, 9, 25, 49, 81]
map()
作為高階函數(shù),事實上它把運(yùn)算規(guī)則抽象了市袖,因此啡直,我們不但可以計算簡單的f(x)=x2,還可以計算任意復(fù)雜的函數(shù)苍碟,比如酒觅,把這個list所有數(shù)字轉(zhuǎn)為字符串:
my_list = [2, 3, 5, 7, 9]
print(list(map(str, my_list)))
# 輸出['2', '3', '5', '7', '9']
reduce()函數(shù)
reduce
把一個函數(shù)作用在一個序列[x1, x2, x3, ...]
上,這個函數(shù)必須接收兩個參數(shù)微峰,reduce
把結(jié)果繼續(xù)和序列的下一個元素做累積計算:
from functools import reduce
my_list = [2, 3, 5, 7, 9]
def f(x, y):
return x * 10 + y
print(reduce(f, my_list))
# 輸出:23579
filter()函數(shù)
filter()
函數(shù)用于過濾序列舷丹。
和map()
類似,filter()
也接收一個函數(shù)和一個序列蜓肆。和map()
不同的是颜凯,filter()
把傳入的函數(shù)依次作用于每個元素谋币,然后根據(jù)返回值是True
還是False
決定保留還是丟棄該元素。
例如症概,在一個list中蕾额,刪掉偶數(shù),只保留奇數(shù)彼城,可以這么寫:
def is_odd(n):
return n % 2 == 1
list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
# 結(jié)果: [1, 5, 9, 15]
把一個序列中的空字符串刪掉诅蝶,可以這么寫:
def not_empty(s):
return s and s.strip()
list(filter(not_empty, ['A', '', 'B', None, 'C', ' ']))
# 結(jié)果: ['A', 'B', 'C']
可見用filter()
這個高階函數(shù),關(guān)鍵在于正確實現(xiàn)一個“篩選”函數(shù)募壕。
注意到filter()
函數(shù)返回的是一個Iterator
调炬,也就是一個惰性序列,所以要強(qiáng)迫filter()
完成計算結(jié)果舱馅,需要用list()
函數(shù)獲得所有結(jié)果并返回list
筐眷。
sorted()函數(shù)
sorted()
函數(shù)也是一個高階函數(shù),它還可以接收一個key
函數(shù)來實現(xiàn)自定義的排序习柠,例如按絕對值大小排序
print(sorted([36, 5, -12, 9, -21], key=abs))
# 輸出:[5, 9, -12, -21, 36]
key
指定的函數(shù)將作用于list
的每一個元素上匀谣,并根據(jù)key
函數(shù)返回的結(jié)果進(jìn)行排序。對比原始的list
和經(jīng)過key=abs
處理過的list
:
list = [36, 5, -12, 9, -21]
keys = [36, 5, 12, 9, 21]
自定義函數(shù)實現(xiàn)排序:
jpg_list = ["dsf345-4.jpg", "s345-2.jpg", "345-9.jpg", "sf345-6.jpg"]
print(sorted(jpg_list))
jpg_list.sort(key=lambda info: info[-5:].split(".")[0])
# jpg_list.sort(key=lambda info: info[-5:-4])
print(jpg_list)
# 輸出
#['345-9.jpg', 'dsf345-4.jpg', 's345-2.jpg', 'sf345-6.jpg']
#['s345-2.jpg', 'dsf345-4.jpg', 'sf345-6.jpg', '345-9.jpg']