Python自學記錄——高階函式map/reduce、filter、sorted
Python內建了四個強大的函式,如標題所示,下面來記錄說明下:
map
看見此 map 需要注意,python中的 map 和 java 中的 map,是不同的,java中的 map 與 python中的字典列表相近。
map是一個十分便利的函式,它可以將list中的每個值執行相同的函式方法,並返回一個新的迭代器物件Iterator,示例如下:
>>> l = [1,2,3,4,5] >>> def pf(num): ... return num * num ... >>> map(pf,l) <map object at 0x0000000001E5F160> >>> #為了方便看結果,用list()把Iterator物件轉換成list >>> list(map(pf,l)) [1, 4, 9, 16, 25]
上述示例中,是將一個包含若干整數的 list 執行 pf 方法,使其得到一個Iterator,並將其轉化為list。
map作為高階函式,可以執行更多複雜的操作,比如,將整型list轉為字元型list,示例如下:
>>> l2 = [1,2,3,4,5]
>>> list(map(str,l2))
['1', '2', '3', '4', '5']
總結下:使用map函式,需要向其傳入兩個引數,第一個為 可迭代物件Iterable 中元素待執行的方法(簡稱函式),第二個為需要執行可迭代物件 Iterator ,如下所示:
map(函式,可迭代物件)
使用它方便,簡單又快捷。
reduce
reduce的使用方法和map類似,它是把函式作用在一個序列上,需要的可迭代物件至少需要兩個元素,示例如下:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
使用reduce前,需要匯入函式,具體寫法如下:
from functools import reduce
它可實現整數字符串 list 轉為一個整數,示例如下:
>>> l3 = [1,2,3,4,5] >>> def list2num(x,y): ... return x * 10 + y ... >>> from functools import reduce >>> reduce(list2num,l3) 12345
藉此,我們可以實現很多事情,下面以浮點字串,轉浮點型為例,結合 map 和 reduce 寫個例子:
>>> import test
>>> test.str2float('123.456')
123.456
上述程式碼呼叫了這個函式的方法:
from functools import reduce
DIGITS = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
def str2float(num):
znum = num[:num.index('.')]
xnum = num[num.index('.')+1:]
xn = len(xnum)
def getnum(num):
return DIGITS[num]
z = list(map(getnum,znum))
x = list(map(getnum,xnum))
def list2num(x,y):
return x*10 + y
nznum = reduce(list2num,z)
nxnum = reduce(list2num,x)
return nznum+ nxnum*pow(0.1,xn)
filter
filter是一個列表過濾器,它可以根據條件過濾出列表中你想要的元素,使用起來也很簡單,示例如下:
def t_test1(n):
return n % 2 == 1
list(filter(t_test1,[1,2,3,4,5,6,7]))
[1,3,5,7]
它的使用方法也很簡單,需要傳兩個引數,一個是根據函式內建條件返回 True 或 False的函式;另一個是可迭代物件Iterator。
filter()把傳入的函式依次作用與每個元素,然後根據返回值是 True 或 False 決定是保留還是丟棄該元素。
把一個序列的中的空字元刪除,寫法如下:
def t_t1(n):
return n and n.strip()
L4 = ['123','a','',' ',None]
list(filter(t_t1,L4))
['123','a']
sorted
sorted是Python內建的一個排序函式,它可以快速便捷的將列表中的元素排序,示例如下:
>>> L = [1,20,-19,25,30,-2]
>>> sorted(L)
[-19, -2, 1, 20, 25, 30]
>>> L2 = ['abc','good','Cat','DOG','CAKE']
>>> sorted(L2)
['CAKE', 'Cat', 'DOG', 'abc', 'good']
如上述示例所示,sorted函式自動將列表中的元素按照大小進行排序,其中,字元傳是根據ASCII碼自字串首位開始比較的。
使用它時,還可以給排序加入條件,比如,數字按絕對值大小排序,字串按全小寫來排序,示例如下:
>>> L = [1,20,-19,25,30,-2]
>>> sorted(L,key=abs)
[1, -2, -19, 20, 25, 30]
>>> L2 = ['abc','good','Cat','DOG','CAKE']
>>> sorted(L2,key=str.lower)
['abc', 'CAKE', 'Cat', 'DOG', 'good']
如果想得到反向排列的列表,新增一個引數即可,示例如下:
>>> L = [1,20,-19,25,30,-2]
>>> sorted(L,key=abs,reverse=True)
[30, 25, 20, -19, -2, 1]
>>> L2 = ['abc','good','Cat','DOG','CAKE']
>>> sorted(L2,key=str.lower,reverse=True)
['good', 'DOG', 'Cat', 'CAKE', 'abc']
sorted可以使程式碼更簡潔,它很強大。
本篇就到這裡,教材網址:https://www.liaoxuefeng.com, 繼續學習~~