先看map。map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是序列,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的list返回。
舉例說(shuō)明,比如我們有一個(gè)函數(shù)a(x)=x*2,要把這個(gè)函數(shù)作用在一個(gè)list [1, 2, 3, 4, 5]上,就可以用map()實(shí)現(xiàn)如下:
代碼如下:
>>> def a(x):
... return x * 2
...
>>> map(a, [1,2,3,4,5])
[2, 4, 6, 8, 10]
map傳入的第一個(gè)參數(shù)a,即a函數(shù),當(dāng)然你也可以不用map函數(shù)實(shí)現(xiàn)這功能:
代碼如下:
>>> list = []
>>> for i in [1, 2, 3, 4, 5]:
... list.append(a(i))
...
>>> print list
[2, 4, 6, 8, 10]
從代碼量上來(lái)講,map要精簡(jiǎn)很多,所以,map()作為高階函數(shù),事實(shí)上它把運(yùn)算規(guī)則抽象了,因此,我們不但可以計(jì)算簡(jiǎn)單的a(x)=x*2,還可以計(jì)算任意復(fù)雜的函數(shù),比如,把這個(gè)list所有數(shù)字轉(zhuǎn)為字符串:
代碼如下:
>>> map(str,[1,2,3,4,5])
['1', '2', '3', '4', '5']
>>>
只需要一行代碼,就搞定了。讓我們?cè)倏春蛠?lái)自顧雪峰python教程的習(xí)題:利用map()函數(shù),把用戶(hù)輸入的不規(guī)范的英文名字,變?yōu)槭鬃帜复髮?xiě),其他小寫(xiě)的規(guī)范名字。輸入:[‘a(chǎn)dam', ‘LISA', ‘barT'],輸出:[‘Adam', ‘Lisa', ‘Bart']。作為我個(gè)人來(lái)說(shuō),我可能會(huì)先將不規(guī)范的英文名全轉(zhuǎn)換在小寫(xiě)然后再通過(guò)capitalize()函數(shù),將首字母轉(zhuǎn)換在寫(xiě),代碼如下:
代碼如下:
>>> def caps(name):
... return name.capitalize()
...
>>> def lowers(name):
... return name.lower()
...
>>> map(caps, map(lowers,['adam', 'LISA', 'barT']))
['Adam', 'Lisa', 'Bart']
再看reduce的用法。reduce(function, sequence, starting_value):對(duì)sequence中的item順序迭代調(diào)用function,如果有starting_value,還可以作為初始值調(diào)用,例如可以用來(lái)對(duì)List求和:
代碼如下:
>>> def add(x, y):
... return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25
>>> reduce(add, range(1, 11))
55
>>> reduce(add, range(1, 11),20)
75
當(dāng)然求和運(yùn)算可以直接用Python內(nèi)建函數(shù)sum(),沒(méi)必要?jiǎng)佑胷educe。但是如果要把序列[1,2,3,4,5,6,7]變換成整數(shù)1234567,reduce就可以派上用場(chǎng):
代碼如下:
>>> def fn(x, y):
... return x * 10 + y
...
>>> reduce(fn, [1,3,4,5,6,7])
134567
新聞熱點(diǎn)
疑難解答
圖片精選