1、map()是 Python 內(nèi)置的高階函數(shù),它接收一個(gè)函數(shù) f和一個(gè)list,并通過(guò)把函數(shù) f 依次作用在 list 的每個(gè)元素上,得到一個(gè)新的 list 并返回。
例如,對(duì)于list [1, 2, 3, 4, 5, 6, 7, 8, 9]
如果希望把list的每個(gè)元素都作平方,就可以用map()函數(shù):

因此,我們只需要傳入函數(shù)f(x)=x*x,就可以利用map()函數(shù)完成這個(gè)計(jì)算:
def f(x):
? ? return x*x
print map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
輸出結(jié)果:
[1, 4, 9, 10, 25, 36, 49, 64, 81]
注意:map()函數(shù)不改變?cè)械?list,而是返回一個(gè)新的 list。
利用map()函數(shù),可以把一個(gè) list 轉(zhuǎn)換為另一個(gè) list,只需要傳入轉(zhuǎn)換函數(shù)。
由于list包含的元素可以是任何類(lèi)型,因此,map() 不僅僅可以處理只包含數(shù)值的 list,事實(shí)上它可以處理包含任意類(lèi)型的 list,只要傳入的函數(shù)f可以處理這種數(shù)據(jù)類(lèi)型。
2、reduce()函數(shù)也是Python內(nèi)置的一個(gè)高階函數(shù)。reduce()函數(shù)接收的參數(shù)和 map()類(lèi)似,一個(gè)函數(shù) f,一個(gè)list,但行為和 map()不同,reduce()傳入的函數(shù) f 必須接收兩個(gè)參數(shù),reduce()對(duì)list的每個(gè)元素反復(fù)調(diào)用函數(shù)f,并返回最終結(jié)果值。
例如,編寫(xiě)一個(gè)f函數(shù),接收x和y,返回x和y的和:
def f(x, y):
? ? return x + y
調(diào)用reduce(f, [1, 3, 5, 7, 9])時(shí),reduce函數(shù)將做如下計(jì)算:
先計(jì)算頭兩個(gè)元素:f(1, 3),結(jié)果為4;
再把結(jié)果和第3個(gè)元素計(jì)算:f(4, 5),結(jié)果為9;
再把結(jié)果和第4個(gè)元素計(jì)算:f(9, 7),結(jié)果為16;
再把結(jié)果和第5個(gè)元素計(jì)算:f(16, 9),結(jié)果為25;
由于沒(méi)有更多的元素了,計(jì)算結(jié)束,返回結(jié)果25。
上述計(jì)算實(shí)際上是對(duì) list 的所有元素求和。雖然Python內(nèi)置了求和函數(shù)sum(),但是,利用reduce()求和也很簡(jiǎn)單。
reduce()還可以接收第3個(gè)可選參數(shù),作為計(jì)算的初始值。如果把初始值設(shè)為100,計(jì)算:
reduce(f, [1, 3, 5, 7, 9], 100)
結(jié)果將變?yōu)?25,因?yàn)榈谝惠営?jì)算是:
計(jì)算初始值和第一個(gè)元素:f(100, 1),結(jié)果為101。
3、filter()函數(shù)是?Python?內(nèi)置的另一個(gè)有用的高階函數(shù),filter()函數(shù)接收一個(gè)函數(shù) f?和一個(gè)list,這個(gè)函數(shù)?f?的作用是對(duì)每個(gè)元素進(jìn)行判斷,返回 True或 False,filter()根據(jù)判斷結(jié)果自動(dòng)過(guò)濾掉不符合條件的元素,返回由符合條件元素組成的新list。
例如,要從一個(gè)list [1, 4, 6, 7, 9, 12, 17]中刪除偶數(shù),保留奇數(shù),首先,要編寫(xiě)一個(gè)判斷奇數(shù)的函數(shù):
def is_odd(x):
? ? return x % 2 == 1
然后,利用filter()過(guò)濾掉偶數(shù):
filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
結(jié)果:[1, 7, 9, 17]
利用filter(),可以完成很多有用的功能,例如,刪除 None 或者空字符串:
def is_not_empty(s):
? ? return s and len(s.strip()) > 0
filter(is_not_empty, ['test', None, '', 'str', '? ', 'END'])
結(jié)果:['test', 'str', 'END']
注意:s.strip(rm) 刪除 s 字符串中開(kāi)頭、結(jié)尾處的 rm 序列的字符。
當(dāng)rm為空時(shí),默認(rèn)刪除空白符(包括'\n', '\r', '\t', ' '),如下:
a = '? ? 123'
a.strip()
結(jié)果:'123'
a='\t\t123\r\n'a.strip()
結(jié)果:'123'