map函數(shù),就是引入一個函數(shù),然后對序列(字符串、列表、字典等)的每一個對象進行操作
1.場景:
對序列的所有對象分別加1
一般我們會先想到使用循環(huán)for:
>>> aList=[1,2,3,4,5]
>>> def add(aList):
for x in range(len(aList)):
aList[x]+=1
>>> add(aList)
>>> aList
[2, 3, 4, 5, 6]
由于思維的慣性,因此我們第一時間就會想到for,但是,我們現(xiàn)在知道了map這個函數(shù),我們就試試重寫函數(shù)
>>> def add(x):
return x+1
>>> aList=[1,2,3,4,5]
>>> list(map(add,aList))
[2, 3, 4, 5, 6]
我們只需要寫一個特定的加法函數(shù),然后使用內(nèi)建函數(shù)map,然后返回一個map的類型
>>> map(add,aList)
<map object at 0x0247B050>
>>> type(map(add,aList))
<class 'map'>
我們再通過list把map轉(zhuǎn)換成列表,打印出來
兩組代碼的結(jié)果都是一樣的,但是明顯第二組代碼結(jié)構(gòu)簡單清晰,當然,對于初學(xué)者或者不知道m(xù)ap函數(shù)的除外,他們會覺得第一種才是首選
上面的代碼引入了一個add的函數(shù),但是,很有可能這個函數(shù)在這里只使用一遍,其他地方都不使用了,我們在這里就結(jié)合lambda表達式,簡化上面的代碼
>>> aList=[1,2,3,4,5]
>>> add=lambda x:x+1 #把表達式單獨列出來
>>> list(map(add,aList))
[2, 3, 4, 5, 6]
>>> list(map(lambda x:x+1,aList)) <span style="font-family: Arial, Helvetica, sans-serif;">#把表達式單獨嵌套在里面</span>
[2, 3, 4, 5, 6]
結(jié)合了lambda表達式,代碼只剩下一行,但可讀性更差
注意:由于map是使得每個序列對象都進行同樣的操作,很多時候都不符合時間的需求,畢竟大多數(shù)的時間序列的操作都是需要分支條件來支持的,因此,map的操作具備一定的局限性。
2.多序列
map除了上面支持單序列之外,它還支持多序列
>>> list(map(pow,[1,2,3],[1,2,3]))
[1, 4, 27]
>>> list(map(pow,[1,2,3],[1,2,3],[1,2,3]))
[0, 0, 0]
從上面可以看出,map支持的多序列必須是滿足里面函數(shù)的參數(shù)個數(shù)等于序列個數(shù),例如pow需要兩個參數(shù),那么,我們只能提供兩個序列,提供三個的時候返回0
>>> list(map(pow,[1,2,3],[1,2]))
[1, 4]
而且,如果序列里面的對象不相一致,它會自動截取
3.模擬map
下面我們來試一下自己模擬map的實現(xiàn),我們使用for
>>> def add(x): return x+1
>>> def test(func,aList):
res=[]
for item in aList:
res.append( func(item))
return res
>>> aList=[1,2,3,4,5]
>>> test(add,aList)
[2, 3, 4, 5, 6]
上面的代碼通過for來模擬map的函數(shù)實現(xiàn),但是由于map是內(nèi)建函數(shù),使用c語音實現(xiàn)的,所以從性能上來說模擬的map要比內(nèi)建的map慢








暫無數(shù)據(jù)