來看兩個(gè)問題:
1. 假設(shè)有一個(gè)數(shù)列,如何把其中每一個(gè)元素都翻倍?
2. 假設(shè)有兩個(gè)數(shù)列,如何求和?
第一個(gè)問題,普通程序員大概會(huì)這么寫:
lst_1 = [1,2,3,4,5,6]
lst_2 = []
for item in lst_1:
lst_2.append(item * 2)
print lst_2
Python 程序員大概會(huì)這么寫:
lst_1 = [1,2,3,4,5,6]
lst_2 = [i * 2 for i in lst_1]
print lst_2
今天來說另一種 Python 程序員常用的寫法 -- map:
lst_1 = [1,2,3,4,5,6]
def double_func(x):
return x * 2
lst_2 = map(double_func, lst_1)
print lst_2
map 是 Python 自帶的內(nèi)置函數(shù),它的作用是把一個(gè)函數(shù)應(yīng)用在一個(gè)(或多個(gè))序列上,把列表中的每一項(xiàng)作為函數(shù)輸入進(jìn)行計(jì)算,再把計(jì)算的結(jié)果以列表的形式返回。
map 的第一個(gè)參數(shù)是一個(gè)函數(shù),之后的參數(shù)是序列,可以是 list、tuple。
所以剛剛那個(gè)問題也可以寫成:
lst_1 = (1,2,3,4,5,6)
lst_2 = map(lambda x: x * 2, lst_1)
print lst_2
這里原數(shù)據(jù)改為了元組,函數(shù)用 lambda 表達(dá)式替代。
map 中的函數(shù)可以對(duì)多個(gè)序列進(jìn)行操作。最開始提出的第二個(gè)問題,除了通常的 for 循環(huán)寫法,如果用列表綜合的方法比較難實(shí)現(xiàn),但用 map 就比較方便:
lst_1 = [1,2,3,4,5,6]
lst_2 = [1,3,5,7,9,11]
lst_3 = map(lambda x, y: x + y, lst_1, lst_2)
print lst_3
map 中的函數(shù)會(huì)從對(duì)應(yīng)的列表中依次取出元素,作為參數(shù)使用,同樣將結(jié)果以列表的形式返回。所以要注意的是,函數(shù)的參數(shù)個(gè)數(shù)要與 map 中提供的序列組數(shù)相同,即函數(shù)有幾個(gè)參數(shù),就得有幾組數(shù)據(jù)。
對(duì)于每組數(shù)據(jù)中的元素個(gè)數(shù),如果有某組數(shù)據(jù)少于其他組,map 會(huì)以 None 來補(bǔ)全這組參數(shù)。