1、什么是高階函數(shù)
把函數(shù)作為參數(shù)傳入谦去,這樣的函數(shù)稱為高階函數(shù)
例如:
def func1(x,y,f):
return f(x) +f(y)
num =func1(-10, 2, abs)
print(num)
注意:
把函數(shù)作為參數(shù)傳入的時(shí)候,不要再傳入函數(shù)后面解括號(hào)蹦哼,
abs代表這個(gè)取絕對(duì)值鳄哭,abs()表示調(diào)用這個(gè)函數(shù),獲取他的返回值
2纲熏、常用高階函數(shù)(map妆丘,filter,sorted局劲,reduce)
map? 映射函數(shù)
一般來說接受兩個(gè)函數(shù)勺拣,第一個(gè)函數(shù)使用作用的函數(shù),第二個(gè)參數(shù)是要作用的可迭代對(duì)象
返回值是一個(gè)迭代器
lst = [1,2,3,4,5,6,7]
lst2 = [10,100,1000,10000]
def f1(x,y):
return x + y
map后面可以接受多個(gè)可迭代對(duì)象鱼填,那傳入幾個(gè)可迭代對(duì)象药有,前面的函數(shù)就要接受幾個(gè)參數(shù)
print(list(map(f1,lst,lst2)))
print(list(map(lambda x,y:x+y, lst, lst2)))
例題:
有列表[1, 2, 3, 4, 5],將所有元素轉(zhuǎn)換成str: ['1', '2', '3', '4', '5']
lst = [1,2,3,4,5]
print(list(map(str,lst)))
filter? ?過濾函數(shù)
filter的第一個(gè)參數(shù)傳入一個(gè)函數(shù)苹丸,第二個(gè)參數(shù)是可迭代對(duì)象愤惰,將可迭代對(duì)象里的每一個(gè)值,交給傳入的函數(shù)處理赘理,如果結(jié)果為真宦言,就保留這個(gè)值。如果結(jié)果為假商模,就去掉這個(gè)值奠旺。
filter也是返回一個(gè)迭代器
例如:
去掉偶數(shù)蜘澜,保留奇數(shù)[1,2,3,4,5,6,7,8,9]
print(list(filter(lambda x : x % 2, [1,2,3,4,5,6,7,8,9])))
在一個(gè)list中,刪掉偶數(shù)响疚,只保留奇數(shù)
lst=['A','','B',None兼都,‘C’,' ','a',1,0]
print(list(filter(lambda x:x and str(x).strip(), lst)))
sorted? ? 排序函數(shù)
sorted()函數(shù)也是一個(gè)高階函數(shù)稽寒,它還可以接收一個(gè)key函數(shù)來實(shí)現(xiàn)自定義的排序key指定的函數(shù)將作用于list的每一個(gè)元素上扮碧,并根據(jù)key函數(shù)返回的結(jié)果進(jìn)行排序。
把一個(gè)序列中的字符串杏糙,忽略大小寫排序
序列:['bob', 'about', 'Zoo', 'Credit']
list1=['bob','about','Zoo','Credit']
print(sorted(list1,key=lambda x:x.lower()))
print(sorted(list1,key=str.lower))
按value來排序
d1 = {"a":3,"b":4,"c":2,"d":5}
print(dict(sorted(d1.items(),key=lambda x:x[1])))
列表里包的排序元素
在元組排序里為False排前面慎王,True排后面
reduce 函數(shù)累積求值?(這個(gè)函數(shù)用的時(shí)候需要導(dǎo)入)
這個(gè)函數(shù)必須接收兩個(gè)參數(shù)
reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算
例如:
將列表[1,3,5,7,9] ---->13579
from functools import reduce
s = [1,3,5,7,9]
print(reduce(lambda x,y:x*10+y, s))
練習(xí):
1、利用map批量檢測用戶名是否符合規(guī)范=> username符合規(guī)范, username不符合規(guī)范
只能包含數(shù)據(jù)宏侍、字母赖淤、下劃線,不以數(shù)字開頭谅河,長度在6-18之間
filter把合法的用戶名顯示出來
lst = ["username","a123","Y_78ju","23hu","was23_67hu"]
import re
def func1(x):
if re.findall(r"^[a-zA-Z_][0-9a-zA-Z_]{5,17}$", x):
return f"{x}符合規(guī)范"
else:
return f"{x}不符合規(guī)范"
print(list(map(func1, lst)))
print(list(filter(lambda x:re.findall(r"^[a-zA-Z_][0-9a-zA-Z_]{5,17}$", x), lst)))
2咱旱、 匿名函數(shù)+reduce實(shí)現(xiàn) 1*2*3*...*n
from functools import reduce
n=[1,2,3,4,5,6,7]
print(reduce(lambda n,y:n*y, n))
3、filter函數(shù):找出[1-100]能被3整除的數(shù)
print(list(filter(lambda x:x%3==0, range(1,101))))
4绷耍、map函數(shù):求list[1-10]各項(xiàng)的平方
print(list(map(lambda x:x*x, range(1,11))))
5吐限、將列表[1,4,5,9] 轉(zhuǎn)換成 '1459'的字符串
from functools import reduce
print(reduce(lambda x,y : str(x)+str(y),[1,4,5,9]))
6、有以下列表:
list1=[7, -8, 5, 4, 0, -2, -5]
正數(shù)在前負(fù)數(shù)在后
整數(shù)從小到大
負(fù)數(shù)從大到小
print(list(sorted(list1,key=lambda x:(x<=0, abs(x)))))
print(sorted(list1,key=lambda x:max(list1)-x+1 if x <=0 else x))
7褂始、這是一個(gè)字符串排序诸典,排序規(guī)則:小寫<大寫<奇數(shù)<偶數(shù)
s = 'asdf234GDSdsf23'?#排序:小寫-大寫-奇數(shù)-偶數(shù)
原理:先比較元組的第一個(gè)值,F(xiàn)ALSE
s = 'asdf234GDSdsf23'
s2 = "".join(sorted(s,key=lambda x: (x.isdigit(),x.isdigit()and int(x) % 2==0,x.isupper(),x)))
print(s2)
deffunc2(x):
return(x.isdigit() ,x.isupper(),x.isdigit()and int(x) % 2== 0,x)
print("".join(sorted(s,key=func2)))
#a -->(False,False,False,'a')
#s -->(False,False,False,'s')
#2 -->(True,True,False,2)
#3 -->(True,False,False,3)
#G -->(False,False,True,"G")