Python四種常用的高階函數(shù),你會用了嗎
每天進(jìn)步一點(diǎn)點(diǎn),關(guān)注我們哦,每天分享測試技術(shù)文章
本文章出自【碼同學(xué)軟件測試】
碼同學(xué)公眾號:自動化軟件測試,領(lǐng)取資料可加:Matongxue_10
碼同學(xué)抖音號:小碼哥聊軟件測試
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ù)后面解括號,
abs代表這個取絕對值,abs()表示調(diào)用這個函數(shù),獲取他的返回值
2、常用高階函數(shù)(map,filter,sorted,reduce)
map? 映射函數(shù)
一般來說接受兩個函數(shù),第一個函數(shù)使用作用的函數(shù),第二個參數(shù)是要作用的可迭代對象
返回值是一個迭代器
lst = [1,2,3,4,5,6,7]
lst2 = [10,100,1000,10000]
def f1(x,y):
? ? return x + y
map后面可以接受多個可迭代對象,那傳入幾個可迭代對象,前面的函數(shù)就要接受幾個參數(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的第一個參數(shù)傳入一個函數(shù),第二個參數(shù)是可迭代對象,將可迭代對象里的每一個值,交給傳入的函數(shù)處理,如果結(jié)果為真,就保留這個值。如果結(jié)果為假,就去掉這個值。
filter也是返回一個迭代器
例如:
去掉偶數(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])))
在一個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ù)也是一個高階函數(shù),它還可以接收一個key函數(shù)來實(shí)現(xiàn)自定義的排序key指定的函數(shù)將作用于list的每一個元素上,并根據(jù)key函數(shù)返回的結(jié)果進(jìn)行排序。
把一個序列中的字符串,忽略大小寫排序
序列:['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ù)累積求值?(這個函數(shù)用的時(shí)候需要導(dǎo)入)
免費(fèi)領(lǐng)取碼同學(xué)軟件測試課程筆記+超多學(xué)習(xí)資料+完整視頻+面試題,可加微信:Matongxue_10
?這個函數(shù)必須接收兩個參數(shù)
reduce把結(jié)果繼續(xù)和序列的下一個元素做累積計(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、這是一個字符串排序,排序規(guī)則:小寫<大寫<奇數(shù)<偶數(shù)
s = 'asdf234GDSdsf23'?#排序:小寫-大寫-奇數(shù)-偶數(shù)
原理:先比較元組的第一個值,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)
def func2(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")
免費(fèi)領(lǐng)取碼同學(xué)軟件測試課程筆記+超多學(xué)習(xí)資料+學(xué)習(xí)完整視頻 ? 可加:Matongxue_8/關(guān)注碼同學(xué)公眾號:自動化軟件測試
本文著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處。