定義
變量可以指向函數(shù)沮尿,函數(shù)的參數(shù)能接收變量,那么一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù)姿搜,這種函數(shù)就稱之為高階函數(shù)捆憎。
實(shí)例:
def add(a,y,f):
return f(a)+f(y)
print(add(3,-4,abs))
Python的內(nèi)建函數(shù)map()和reduce()函數(shù)
map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù)躲惰,一個(gè)是iterable,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的Iterator返回础拨。
實(shí)例:
def f(x):
return x*x
r=map(f,[1,2,3,4,5,6,7,8,9])
print(list(r))
注釋:map()傳入的第一個(gè)參數(shù)是f,即函數(shù)對(duì)象本身。由于結(jié)果r是一個(gè)Iterator滔蝉,Iterator是惰性序列,因此通過list()函數(shù)讓它把整個(gè)序列都計(jì)算出來并返回一個(gè)list塔沃。
reduce()
把一個(gè)函數(shù)作用在一個(gè)序列[X1,X2,X3...]上,這個(gè)函數(shù)必須接受兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算螃概,其效果是
reduce(f,[x1,x2,x3,x4])=f(f(f(x1,x2),x3),x4)
實(shí)例:
from functoolsimport reduce
def add(x,y):
return x*y
r=reduce(add,[1,3,5,7,9])
print(r)
實(shí)例2:
from functoolsimport reduce
def fn(x,y):
return x*10+y
y=reduce(fn,[1,2,3,4,5,6])
print(y)
實(shí)例3:(將字符串變?yōu)閕nt型)
from functoolsimport reduce
def fn(x,y):
return x*10+y
def char2num(s):
digits={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
return digits[s]
t=reduce(fn,map(char2num,'123456'))
print(t)
(當(dāng)不使用python定義的函數(shù)時(shí)可以自定義函數(shù)轉(zhuǎn)類型)
整理為一個(gè)函數(shù)為:
from functoolsimport reduce
DIGITS={'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
def str2int(s):
def fn(x,y):
return x *10 + y
def char2num(s):
return DIGITS[s]
return reduce(fn,map(char2num,s))
print('123456789')
練習(xí):首字母大寫矫夯,后面的字母小寫
def fn(s):
s=s[0].upper()+s[1:].lower()
return s
r=map(fn,['adam', 'LISA', 'barT'])
print(list(r))
練習(xí)2:累積函數(shù)
from functoolsimport reduce
def prod(x,y):
return x*y
L=[1,2,3,4,5]
r=reduce(prod,L)
print(r)
練習(xí)3:字符串轉(zhuǎn)化為整數(shù)
from functoolsimport reduce
def str2float(s):
def fn(x,y):
return x*10+y
def char2num(s):
return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
n=s.index('.')
s1=list(map(int,[xfor xin s[:n]]))
s2=list(map(int,[xfor xin s[n+1:]]))
return reduce(fn,s1)+reduce(fn,s2)/10**len(s2)
print(str2float('123.567'))
filter
filter()函數(shù)用于過濾序列
和map()類似,filter()也接收一個(gè)函數(shù)和一個(gè)序列吊洼。和map()不同的是训貌,filter()把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素融蹂。
實(shí)例:(保留奇數(shù))
def is_odd(n):
return n%2==1
r=filter(is_odd,[1,2,3,4,5,6])
print(list(r))
實(shí)例:過濾列表空的元素
def not_enpty(s):
return sand s.strip()
r=filter(not_enpty,['A','B','','K',None])
print(list(r))
說明:filter()這個(gè)高階函數(shù)旺订,關(guān)鍵在于正確實(shí)現(xiàn)一個(gè)“篩選“函數(shù)。
filter()函數(shù)返回的是一個(gè)Iterator超燃,也就是一個(gè)惰性序列区拳,所以要強(qiáng)迫filter()完成計(jì)算結(jié)果,需要用list()函數(shù)獲得所有結(jié)果并返回list.
實(shí)例:filter篩選素?cái)?shù)
def odd_iter():
n=1
? ? while True:
n=n+2
? ? ? ? yield n
def not_divisible(n):
return lambda x:x%n>0
def primes():
yield 2
? ? it=odd_iter()
while True:
n=next(it)
yield n
it =filter(not_divisible(n),it)
for nin primes():
if n<1000:
print(n)
else:
break
sorted
sorted()函數(shù)可以對(duì)list進(jìn)行排序:
實(shí)例:對(duì)list元素進(jìn)行排序
l=sorted([1,-2,5,78,90,-89])
print(l)
sorted()函數(shù)也是一個(gè)高階函數(shù)意乓,它可以接受一個(gè)key函數(shù)來實(shí)現(xiàn)自定義的排序樱调,例如按絕對(duì)值大小排序:
s=sorted([36,-78,1,0,56],key=abs)
print(s)
實(shí)例:對(duì)字符串進(jìn)行排序
L=['abc','Zoom','Xiaobin']
print(sorted(L))
注釋:默認(rèn)情況下,對(duì)字符串排序届良,是按照ASCII的大小比較的笆凌,由于‘Z’<‘a(chǎn)’,結(jié)果士葫,大寫字母Z會(huì)排在小寫字母a的前面乞而。
實(shí)例:忽略大小寫比較字符串
L=['abc','Zoom','Xiaobin']
print(sorted(L,key=str.lower))
實(shí)例:字符串反向排序
L=['abc','Zoom','Xiaobin']
print(sorted(L,key=str.lower,reverse=True))
練習(xí):根據(jù)姓名排序
L=[('Bob',75),('Adam',92),('Bart',66),('Linda',88)]
print(sorted(L))
根據(jù)成績(jī)排序:
L=[('Bob',75),('Adam',92),('Bart',66),('Linda',88)]
L2=sorted(L,key=lambda t:t[1])
print(L2)
按照成績(jī)倒序:
from operatorimport itemgetter
L=[('Bob',75),('Adam',92),('Bart',66),('Linda',88)]
L2=sorted(L,key=itemgetter(1),reverse=True)
print(L2)