Python函數式編程之map()python
http://blog.csdn.net/seetheworld518/article/details/46959871 編程
Python中map()、filter()、reduce()這三個都是應用於序列的內置函數。
格式:
map(func, seq1[, seq2,…])
第一個參數接受一個函數名,後面的參數接受一個或多個可迭代的序列,返回的是一個集合。
Python函數編程中的map()函數是將func做用於seq中的每個元素,並將全部的調用的結果做爲一個list返回。若是func爲None,做用同zip()。api
一、當seq只有一個時,將函數func做用於這個seq的每一個元素上(對於列表[[1,2,3],[2,4,6]],有兩個元素,而且每一個元素是一個列表),並獲得一個新的seq。
讓咱們來看一下只有一個seq的時候,map()函數是如何工做的。
從上圖能夠看出,函數func函數會做用於seq中的每一個元素,獲得func(seq[n])組成的列表。下面舉得例子來幫助咱們更好的理解這個工做過程。微信
#使用lambda>>> print map(lambda x: x % 2, range(7)) [0, 1, 0, 1, 0, 1, 0]123123
#使用列表解析>>> print [x % 2 for x in range(7)] [0, 1, 0, 1, 0, 1, 0]123123
一個seq時,可使用filter()函數代替,那什麼狀況不能代替呢?ide
二、當seq多於一個時,map能夠並行(注意是並行)地對每一個seq執行以下圖所示的過程:
從圖能夠看出,每一個seq的同一位置的元素同時傳入一個多元的func函數以後,獲得一個返回值,並將這個返回值存放在一個列表中。下面咱們看一個有多個seq的例子:函數式編程
>>> print map(lambda x , y : x ** y, [2,4,6],[3,2,1])[8, 16, 6]1212
若是上面咱們不使用map函數,就只能使用for循環,依次對每一個位置的元素調用該函數去執行。還可使返回值是一個元組。如:函數
>>> print map(lambda x , y : (x ** y, x + y), [2,4,6],[3,2,1])[(8, 5), (16, 6), (6, 7)]1212
當func函數時None時,這就同zip()函數了,而且zip()開始取代這個了,目的是將多個列表相同位置的元素歸併到一個元組。如:學習
>>> print map(None, [2,4,6],[3,2,1])[(2, 3), (4, 2), (6, 1)]1212
須要注意的是:
map沒法處理seq長度不一致、對應位置操做數類型不一致的狀況,這兩種狀況都會報類型錯誤。以下圖: url
三、使用map()函數能夠實現將其餘類型的數轉換成list,可是這種轉換也是有類型限制的,具體什麼類型限制,在之後的學習中慢慢摸索吧。這裏給出幾個能轉換的例子:spa
***將元組轉換成list***>>> map(int, (1,2,3)) [1, 2, 3] ***將字符串轉換成list***>>> map(int, '1234') [1, 2, 3, 4] ***提取字典的key,並將結果存放在一個list中***>>> map(int, {1:2,2:3,3:4}) [1, 2, 3] ***字符串轉換成元組,並將結果以列表的形式返回***>>> map(tuple, 'agdf') [('a',), ('g',), ('d',), ('f',)]#將小寫轉成大寫def u_to_l (s): return s.upper()print map(u_to_l,'asdfd')1234567891011121314151612345678910111213141516
頂
1
踩