詳解Python中高階函數(shù)(map,filter,reduce,sorted)的使用
什么是高階函數(shù)
高階函數(shù)就是能夠把函數(shù)當(dāng)成參數(shù)傳遞的函數(shù)就是高階函數(shù),換句話說(shuō)如果一個(gè)函數(shù)的參數(shù)是函數(shù),那么這個(gè)函數(shù)就是一個(gè)高階函數(shù)。
高階函數(shù)可以是你使用def
關(guān)鍵字自定義的函數(shù),也有Python系統(tǒng)自帶的內(nèi)置高階函數(shù)。
自定義一個(gè)高階函數(shù)
我們下面的例子中,函數(shù) senior 的參數(shù)中有一個(gè)是函數(shù),那么senior就是一個(gè)高階函數(shù);函數(shù) tenfold 的參數(shù)不是函數(shù),所以tenfold就只是一個(gè)普通的函數(shù)。
# 定義高階函數(shù) def senior(func, container): """ 將容器中的數(shù)據(jù)依次放入函數(shù)中進(jìn)行運(yùn)算, 將結(jié)果返回到迭代器中,最后返回迭代器。 """ lst = list() for i in container: lst.append(func(i)) return iter(lst) # 定義普通的功能函數(shù) def tenfold(num): """ 十倍器 將數(shù)據(jù)乘 10,返回結(jié)果。 """ return num * 10 # 定義一個(gè)列表 lst = [10, 20666, 'msr'] # 使用高階函數(shù) it = senior(tenfold, lst) print(list(it)) # [100, 206660, 'msrmsrmsrmsrmsrmsrmsrmsrmsrmsr']
常用的內(nèi)置高階函數(shù)
函數(shù) | 功能作用 |
---|---|
map | 處理可迭代對(duì)象中的數(shù)據(jù),將處理的結(jié)果返回到迭代器中。 |
filter | 過(guò)濾可迭代對(duì)象中的數(shù)據(jù),將過(guò)濾好的數(shù)據(jù)返回到迭代器中。 |
reduce | 處理可迭代對(duì)象中的數(shù)據(jù),將最終的結(jié)果返回出來(lái)。 |
sorted | 排序可迭代對(duì)象中的數(shù)據(jù),將排序好的結(jié)果返回出來(lái)。 |
map函數(shù)
語(yǔ)法:map(function, Iterable)
參數(shù)說(shuō)明
function:函數(shù),可以是 自定義函數(shù) 或者是 內(nèi)置函數(shù);
iterable:可迭代對(duì)象,可迭代性數(shù)據(jù)。(容器類(lèi)型數(shù)據(jù)和類(lèi)容器類(lèi)型數(shù)據(jù)、range對(duì)象、迭代器)
功能
把可迭代對(duì)象中的數(shù)據(jù)一個(gè)一個(gè)拿出來(lái),然后放在到指定的函數(shù)中做處理,將處理之后的結(jié)果依次放入迭代器中,最后返回這個(gè)迭代器。
實(shí)例
將列表中的元素轉(zhuǎn)成整型類(lèi)型,然后返回出來(lái)。
lst = ['1', '2', '3', '4'] """ 使用常規(guī)的寫(xiě)法 """ new_lst = list() for i in lst: new_lst.append(int(i)) print(new_lst) # [1, 2, 3, 4] """ 使用map函數(shù)實(shí)現(xiàn) """ it = map(int, lst) new_lst = list(it) print(new_lst) # [1, 2, 3, 4]
列表中的每一個(gè)數(shù)依次乘 2的下標(biāo)索引+1 次方。使用自定義的函數(shù),配合實(shí)現(xiàn)功能。
lst = [1, 2, 3, 4] """ 普通的方法,利用左移 """ new_lst = list() for i in lst: res = i << i new_lst.append(res) print(new_lst) # [2, 8, 24, 64] """ 使用map函數(shù) """ # 先定義一個(gè)左移函數(shù),自定義的函數(shù)必須是一個(gè)帶參函數(shù)并且有返回值 def func(num): return num << num new_lst = list(map(func, lst)) print(new_lst) # [2, 8, 24, 64] """ 使用lambda簡(jiǎn)化 """ new_lst = list(map(lambda num: num << num, lst)) print(new_lst) # [2, 8, 24, 64]
filter函數(shù)
語(yǔ)法:filter(function, iterable)
參數(shù)的意義和map函數(shù)一樣
功能
filter用于過(guò)濾數(shù)據(jù),將可迭代對(duì)象中的數(shù)據(jù)一個(gè)一個(gè)的放入函數(shù)中進(jìn)行處理,如果函數(shù)返回值為真,將數(shù)據(jù)保留;反之不保留,最好返回迭代器。
實(shí)例
保留容器中的偶數(shù)
lst = [11, 2, 3, 34, 4, 4, 55] """ 常規(guī)寫(xiě)法 """ new_lst = list() for i in lst: if i % 2 == 0: new_lst.append(i) print(new_lst) # [2, 34, 4, 4] """ 使用filter函數(shù) """ def func(num): if num % 2 == 0: return True new_lst = list(filter(func, lst)) print(new_lst) # [2, 34, 4, 4] """ filter + lambda """ new_lst = list(filter(lambda num: True if (num % 2 == 0) else False, lst)) print(new_lst) # [2, 34, 4, 4]
reduce函數(shù)
語(yǔ)法:reduce(function, iterable)
參數(shù)含義與map、filter一致。
功能
計(jì)算數(shù)據(jù),將可迭代對(duì)象的中的前兩個(gè)值放在函數(shù)中做出運(yùn)算,得出結(jié)果在和第三個(gè)值放在函數(shù)中運(yùn)算得出結(jié)果,以此類(lèi)推,直到所有的結(jié)果運(yùn)算完畢,返回最終的結(jié)果。
根據(jù)功能我們就應(yīng)該直到,reduce中的函數(shù)需要可以接收兩個(gè)參數(shù)才可以。
實(shí)例
reduce函數(shù)使用需要先從標(biāo)準(zhǔn)庫(kù)functools中導(dǎo)入
將列表中的數(shù)據(jù)元素組合成為一個(gè)數(shù),
from functools import reduce lst = [2, 0, 6, 6, 6] """ 常規(guī)方法 """ char = str() for i in lst: char += str(i) print(int(char)) # 20666 """ 使用reduse函數(shù) """ def func(x, y): return x * 10 + y res = reduce(func, lst) print(res) # 20666 """ reduce + lambda """ res = reduce((lambda x, y: (x * 10 + y)), lst) print(res) # 20666
sorted函數(shù)
語(yǔ)法:sorted(Iterable, key=function, reverse=False)
參數(shù)說(shuō)明
iterable:可迭代對(duì)象;
key:指定函數(shù),默認(rèn)為空;
reverse:排序的方法,默認(rèn)為False,意為升序;
功能
如果沒(méi)有指定函數(shù),就單純的將數(shù)據(jù)安札ASCII進(jìn)行排序;如果指定了函數(shù),就將數(shù)據(jù)放入函數(shù)中進(jìn)行運(yùn)算,根據(jù)數(shù)據(jù)的結(jié)果進(jìn)行排序,返回新的數(shù)據(jù),不會(huì)改變?cè)械臄?shù)據(jù)。
注意,如果指定了函數(shù),排序之后是根據(jù)數(shù)據(jù)的結(jié)果對(duì)原數(shù)據(jù)進(jìn)行排序,而不是排序計(jì)算之后的就結(jié)果數(shù)據(jù)。
實(shí)例
將列表中的數(shù)據(jù)進(jìn)行排序。
lst = [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3] """ 使用列表的內(nèi)置函數(shù)進(jìn)行排序,默認(rèn)升序 """ lst.sort() print(lst) # [-3, 1, 5, 6, 12, 12, 23, 34, 342, 2345] # 降序排序 lst.sort(reverse=True) print(lst) # [2345, 342, 34, 23, 12, 12, 6, 5, 1, -3] lst = [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3] """ 使用sorted進(jìn)行排序 """ new_lst = sorted(lst) print(new_lst) # [-3, 1, 5, 6, 12, 12, 23, 34, 342, 2345] print(lst) # [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3]
還有一點(diǎn)就是 sorted 函數(shù)可以將數(shù)據(jù)放入函數(shù)中進(jìn)行處理,然后根據(jù)結(jié)果進(jìn)行排序。
lst = [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3] """ 按照絕對(duì)值進(jìn)行排序 """ new_lst = sorted(lst, key=abs) print(new_lst) # [1, -3, 5, 6, 12, 12, 23, 34, 342, 2345] """ 按照除以10的余數(shù)進(jìn)行排序 """ def func(num): return num % 10 new_lst = sorted(lst, key=func) print(new_lst) # [1, 342, 12, 12, 23, 34, 5, 2345, 6, -3] # 可以看到,我們指定函數(shù)之后排序的結(jié)果既不是原數(shù)據(jù)的絕對(duì)值、也不是原數(shù)據(jù)除以10的余數(shù),而是根據(jù)這兩種計(jì)算結(jié)果對(duì)原數(shù)據(jù)進(jìn)行了排序。
sort和sorted
既然有了列表的內(nèi)置函數(shù)sort,為什么我們還要使用sorted函數(shù)呢?
- sorted可以排序一切可迭代對(duì)象,但是sort只是列表的內(nèi)置函數(shù),只能對(duì)列表進(jìn)行排序;
- sorted排序返回新的數(shù)據(jù),不改變?cè)瓟?shù)據(jù),sort改變了原數(shù)據(jù);
- sorted可以指定函數(shù),根據(jù)函數(shù)的計(jì)算結(jié)果、按照某一種方式進(jìn)行排序,但是sort只能單純的根據(jù)數(shù)字大小和ASCII進(jìn)行排序。
總結(jié)
高階函數(shù)就是將函數(shù)作為參數(shù)的函數(shù)。
map(Function,Iterable)(將可迭代性數(shù)據(jù)中的元素一一取出放入函數(shù)中進(jìn)行運(yùn)算在將結(jié)果返回,最后返回的數(shù)據(jù)類(lèi)型是迭代器)
filter(Function,Iterable)(過(guò)濾數(shù)據(jù),將可迭代性數(shù)據(jù)放入函數(shù)中進(jìn)行運(yùn)算,結(jié)果為真將數(shù)據(jù)返回,反之舍棄,最會(huì)返回的數(shù)據(jù)類(lèi)型是迭代器)
reduce(Function,Iterable)(計(jì)算數(shù)據(jù),將可迭代型數(shù)據(jù)中的前兩個(gè)元素拿出放入函數(shù)中進(jìn)行運(yùn)算將結(jié)果在與后一個(gè)元素進(jìn)行運(yùn)算,最后返回最終的結(jié)果)
sorted(Iterable,[key=Function],[reverse =Bool(False(default)/True)])(將可迭代型數(shù)據(jù)進(jìn)行排序,或?qū)⒖傻蛿?shù)據(jù)放入函數(shù)中進(jìn)行運(yùn)算將結(jié)果進(jìn)行排序返回)
以上就是詳解Python中高階函數(shù)(map,filter,reduce,sorted)的使用的詳細(xì)內(nèi)容,更多關(guān)于Python高階函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)調(diào)用達(dá)夢(mèng)數(shù)據(jù)庫(kù)的教程分享
這篇文章主要為大家詳細(xì)介紹了Python是如何調(diào)用達(dá)夢(mèng)數(shù)據(jù)庫(kù)的,文中的示例代碼簡(jiǎn)潔易懂,具有一定的學(xué)習(xí)和參考價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06Python實(shí)現(xiàn)定時(shí)發(fā)送監(jiān)控郵件
這篇文章主要為大家講解如何用python連接郵箱,實(shí)現(xiàn)自動(dòng)發(fā)送監(jiān)控郵件,文中的示例講解詳細(xì),對(duì)我們了解Python有一定的幫助,需要的可以參考一下2022-01-01Python Tornado之跨域請(qǐng)求與Options請(qǐng)求方式
這篇文章主要介紹了Python Tornado之跨域請(qǐng)求與Options請(qǐng)求方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03解決Python pip 自動(dòng)更新升級(jí)失敗的問(wèn)題
今天小編就為大家分享一篇解決Python pip 自動(dòng)更新升級(jí)失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Python安裝配置OpenGL環(huán)境的全過(guò)程記錄
這篇文章主要給大家介紹了關(guān)于Python安裝配置OpenGL環(huán)境的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03