前言
高階函數指的是能接收函數作為參數的函數或類;python中有一些內置的高階函數,在某些場合使用可以提高代碼的效率.
map()
map函數可以把一個迭代對象轉換成另一個可迭代對象,不過在python3中,結果都是一個map對象,它是一個生成器,可以通過next函數獲取它的元素;使用map函數的代碼效率比for循環和列表生成式都要高。
參數:
一個函數func,可以是任何函數;
一個或多個可迭代對象,可以是元組、集合、列表等;如果函數有多個參數就傳入多個可迭代對象;
# 單個參數
p = map(int,{2,3,4,5})
# 多個參數
def add(x,y,z):
return x+y+z
p1 = map(add,[1,2,3],(4,5,6),{7,8,9}) # 注意如果是集合,順序是不固定的
# 由於是一個map對象,可以轉換為list對象
li = list(p1)
reduce()
reduce函數在python3中被放置到functool模塊中了,要使用需要引入;
參數:一個函數f,一個可迭代對象,一個可選的初始值;
功能:通過對函數f的反復調用,可以得到最終的積累結果;
def test5(listx):
from functools import reduce
res = reduce(add1,listx)
print(res)
def add1(x,y):
return x+y
li = [1,2,4,7,8]
test5(li)
filter()
過濾函數,可以將可迭代對象里的每個元素依次作用於過濾函數,通過返回的false和true對元素進行保留或丟棄;最后返回一個filter對象,該對象是一個生成器;
參數:
func:一個過濾函數,可以是匿名函數;
iterator:一個等待過濾的可迭代對象;
li = [1, 2, 4, 7, 8]
res = filter(lambda x: x % 2 == 1, li)
print(list(res))
max
max內置函數不僅僅是用來獲取一個容器中的算術最大值,事實上它可以自定義比較的規則。
# 參數:
key:比較的規則
values:比較值
x = max(['name','age','you'],key=lambda x:len(x))
print(x) # name
y = max('name','age','you',key=lambda x:len(x))
print(y) # name
min
用來獲取一個容器中的最小值,用法參考max.
sorted
sorted函數用來對容器里的元素進行重新排序並返回一個新的容器,支持自定義比較規則。
# 參數
key:比較規則;
reverse:排列規則,默認False,升序排列
values:第一個參數必須是一個容器
x = sorted(['name','age','you'],key=lambda x:len(x),reverse=False)
print(x)
partial
偏函數partial是一個類,有時候一些函數在使用的時候要求不能有參數或者為了少傳遞參數,典型的如flask框架中的session和g等代理對象的創建,這時可以將函數轉化成偏函數;它的原理是將函數的對象和參數作為參數生成一個partial對象,調用時傳入的新參數和對象存儲的參數合並后再調用原來的函數,即將傳參分成兩步完成。
from functools import partial, partialmethod
new_func = partial(get_values, *(2,3)) # 第一步先傳兩個參數,注意需要解包
print(new_func(4)) # 再傳最后一個參數
總結
-
partial類的作用就是將一個函數執行拆成兩步:先傳參后執行或先傳部分參,后再傳參調用執行;
-
sorted方法對容器元素按照指定的規則排序;
-
max和min方法按照指定的比較規則選出容器的最大最小值;
-
filter類對容器元素進行過濾;
-
reduce方法對元素迭代積累;
-
map類按照自定規則將容器里的所有元素轉化成另外的元素值得到一個新的容器;