Python四種常用的高階函數(shù),你會(huì)用了嗎

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批量檢測(cè)用戶名是否符合規(guī)范=> username符合規(guī)范, username不符合規(guī)范

只能包含數(shù)據(jù)、字母、下劃線,不以數(shù)字開頭,長(zhǎng)度在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")

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容