| 導航:起始頁 > Dive Into Python > 函數編程 > 重識列表映射 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
>>> def double(n): ... return n*2 ... >>> li = [1, 2, 3, 5, 9, 10, 256, -3] >>> map(double, li)[2, 4, 6, 10, 18, 20, 512, -6] >>> [double(n) for n in li]
[2, 4, 6, 10, 18, 20, 512, -6] >>> newlist = [] >>> for n in li:
... newlist.append(double(n)) ... >>> newlist [2, 4, 6, 10, 18, 20, 512, -6]
| map 接受一個函數和一個列表作為參數,[13] 并對列表中的每個元素依次調用函數返回一個新的列表。在這個例子中,函數僅僅是將每個元素乘以 2。 | |
| 使用列表解析的方法你可以做到相同的事情。列表解析是在 Python 2.0 版時被引入的;而 map 則古老得多。 | |
| 你如果堅持以 Visual Basic 程序員自居,通過 for 循環的方法完成相同的任務也完全可以。 |
>>> li = [5, 'a', (2, 'b')] >>> map(double, li)[10, 'aa', (2, 'b', 2, 'b')]
好了,玩夠了。讓我們來看一些真實代碼。
filenameToModuleName = lambda f: os.path.splitext(f)[0]
moduleNames = map(filenameToModuleName, files) 
| 正如你在 第 4.7 節 “使用 lambda 函數” 中所見,lambda 定義一個內聯函數。也正如你在 例 6.17 “分割路徑名” 中所見,os.path.splitext 接受一個文件名并返回一個元組 (name, extension)。因此 filenameToModuleName 是一個接受文件名,剝離出其擴展名,然后只返回文件名稱的函數。 | |
| 調用 map 將把 files 列出的所有文件名傳遞給 filenameToModuleName 函數,并且返回每個函數調用結果所組成的列表。換句話說,你剔除掉文件名的擴展名,并將剔除后的文件名存于 moduleNames 之中。 |
如你在本章剩余部分將看到的,你可以將這種數據中心思想擴展到定義和執行一個容納來自很多單個測試套件的測試的一個測試套件的最終目標。
[13] 同前,我需要指出 map 可以接受一個列表、元組,或者一個像序列一樣的對象。參見前面的關于 filter 的腳注。
<< 重識列表過濾 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
數據中心思想編程 >> |