網站首頁 編程語言 正文
什么是高階函數
高階函數就是能夠把函數當成參數傳遞的函數就是高階函數,換句話說如果一個函數的參數是函數,那么這個函數就是一個高階函數。
高階函數可以是你使用def
關鍵字自定義的函數,也有Python系統(tǒng)自帶的內置高階函數。
自定義一個高階函數
我們下面的例子中,函數 senior 的參數中有一個是函數,那么senior就是一個高階函數;函數 tenfold 的參數不是函數,所以tenfold就只是一個普通的函數。
# 定義高階函數 def senior(func, container): """ 將容器中的數據依次放入函數中進行運算, 將結果返回到迭代器中,最后返回迭代器。 """ lst = list() for i in container: lst.append(func(i)) return iter(lst) # 定義普通的功能函數 def tenfold(num): """ 十倍器 將數據乘 10,返回結果。 """ return num * 10 # 定義一個列表 lst = [10, 20666, 'msr'] # 使用高階函數 it = senior(tenfold, lst) print(list(it)) # [100, 206660, 'msrmsrmsrmsrmsrmsrmsrmsrmsrmsr']
常用的內置高階函數
函數 | 功能作用 |
---|---|
map | 處理可迭代對象中的數據,將處理的結果返回到迭代器中。 |
filter | 過濾可迭代對象中的數據,將過濾好的數據返回到迭代器中。 |
reduce | 處理可迭代對象中的數據,將最終的結果返回出來。 |
sorted | 排序可迭代對象中的數據,將排序好的結果返回出來。 |
map函數
語法:map(function, Iterable)
參數說明
function:函數,可以是 自定義函數 或者是 內置函數;
iterable:可迭代對象,可迭代性數據。(容器類型數據和類容器類型數據、range對象、迭代器)
功能
把可迭代對象中的數據一個一個拿出來,然后放在到指定的函數中做處理,將處理之后的結果依次放入迭代器中,最后返回這個迭代器。
實例
將列表中的元素轉成整型類型,然后返回出來。
lst = ['1', '2', '3', '4'] """ 使用常規(guī)的寫法 """ new_lst = list() for i in lst: new_lst.append(int(i)) print(new_lst) # [1, 2, 3, 4] """ 使用map函數實現 """ it = map(int, lst) new_lst = list(it) print(new_lst) # [1, 2, 3, 4]
列表中的每一個數依次乘 2的下標索引+1 次方。使用自定義的函數,配合實現功能。
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函數 """ # 先定義一個左移函數,自定義的函數必須是一個帶參函數并且有返回值 def func(num): return num << num new_lst = list(map(func, lst)) print(new_lst) # [2, 8, 24, 64] """ 使用lambda簡化 """ new_lst = list(map(lambda num: num << num, lst)) print(new_lst) # [2, 8, 24, 64]
filter函數
語法:filter(function, iterable)
參數的意義和map函數一樣
功能
filter用于過濾數據,將可迭代對象中的數據一個一個的放入函數中進行處理,如果函數返回值為真,將數據保留;反之不保留,最好返回迭代器。
實例
保留容器中的偶數
lst = [11, 2, 3, 34, 4, 4, 55] """ 常規(guī)寫法 """ new_lst = list() for i in lst: if i % 2 == 0: new_lst.append(i) print(new_lst) # [2, 34, 4, 4] """ 使用filter函數 """ 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函數
語法:reduce(function, iterable)
參數含義與map、filter一致。
功能
計算數據,將可迭代對象的中的前兩個值放在函數中做出運算,得出結果在和第三個值放在函數中運算得出結果,以此類推,直到所有的結果運算完畢,返回最終的結果。
根據功能我們就應該直到,reduce中的函數需要可以接收兩個參數才可以。
實例
reduce函數使用需要先從標準庫functools中導入
將列表中的數據元素組合成為一個數,
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函數 """ 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函數
語法:sorted(Iterable, key=function, reverse=False)
參數說明
iterable:可迭代對象;
key:指定函數,默認為空;
reverse:排序的方法,默認為False,意為升序;
功能
如果沒有指定函數,就單純的將數據安札ASCII進行排序;如果指定了函數,就將數據放入函數中進行運算,根據數據的結果進行排序,返回新的數據,不會改變原有的數據。
注意,如果指定了函數,排序之后是根據數據的結果對原數據進行排序,而不是排序計算之后的就結果數據。
實例
將列表中的數據進行排序。
lst = [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3] """ 使用列表的內置函數進行排序,默認升序 """ 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進行排序 """ 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]
還有一點就是 sorted 函數可以將數據放入函數中進行處理,然后根據結果進行排序。
lst = [1, 23, 34, 5, 6, 342, 12, 12, 2345, -3] """ 按照絕對值進行排序 """ new_lst = sorted(lst, key=abs) print(new_lst) # [1, -3, 5, 6, 12, 12, 23, 34, 342, 2345] """ 按照除以10的余數進行排序 """ 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] # 可以看到,我們指定函數之后排序的結果既不是原數據的絕對值、也不是原數據除以10的余數,而是根據這兩種計算結果對原數據進行了排序。
sort和sorted
既然有了列表的內置函數sort,為什么我們還要使用sorted函數呢?
- sorted可以排序一切可迭代對象,但是sort只是列表的內置函數,只能對列表進行排序;
- sorted排序返回新的數據,不改變原數據,sort改變了原數據;
- sorted可以指定函數,根據函數的計算結果、按照某一種方式進行排序,但是sort只能單純的根據數字大小和ASCII進行排序。
總結
高階函數就是將函數作為參數的函數。
map(Function,Iterable)(將可迭代性數據中的元素一一取出放入函數中進行運算在將結果返回,最后返回的數據類型是迭代器)
filter(Function,Iterable)(過濾數據,將可迭代性數據放入函數中進行運算,結果為真將數據返回,反之舍棄,最會返回的數據類型是迭代器)
reduce(Function,Iterable)(計算數據,將可迭代型數據中的前兩個元素拿出放入函數中進行運算將結果在與后一個元素進行運算,最后返回最終的結果)
sorted(Iterable,[key=Function],[reverse =Bool(False(default)/True)])(將可迭代型數據進行排序,或將可迭代型數據放入函數中進行運算將結果進行排序返回)
原文鏈接:https://www.cnblogs.com/msr20666/p/16188820.html
相關推薦
- 2022-03-20 Android實現桌面快捷方式實例代碼_Android
- 2022-11-01 如何使用Kubernetes自定義資源(CRD)詳解_云其它
- 2022-07-11 查看 jvm 參數
- 2022-01-30 uniapp蘋果底部欄自適應配置
- 2022-07-25 C/C++實現線性單鏈表的示例代碼_C 語言
- 2022-11-09 python進行數據合并concat/merge_python
- 2022-04-21 Android實現水波紋效果實例代碼_Android
- 2022-01-29 調用存儲命令:將sqlserver表中的數據導出sql語句或生成insert into語句
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支