<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    16.4. 重識列表映射

    你對使用列表解析映射列表的做法已經熟知。另一種方法可以完成同樣的工作:使用內建 map 函數。它的工作機理和 filter 函數類似。

    例 16.10. map 介紹

    >>> def double(n):
    ...     return n*2
    ...     
    >>> li = [1, 2, 3, 5, 9, 10, 256, -3]
    >>> map(double, li)                       1
    [2, 4, 6, 10, 18, 20, 512, -6]
    >>> [double(n) for n in li]               2
    [2, 4, 6, 10, 18, 20, 512, -6]
    >>> newlist = []
    >>> for n in li:                          3
    ...     newlist.append(double(n))
    ...     
    >>> newlist
    [2, 4, 6, 10, 18, 20, 512, -6]
    1 map 接受一個函數和一個列表作為參數,[13] 并對列表中的每個元素依次調用函數返回一個新的列表。在這個例子中,函數僅僅是將每個元素乘以 2。
    2 使用列表解析的方法你可以做到相同的事情。列表解析是在 Python 2.0 版時被引入的;而 map 則古老得多。
    3 你如果堅持以 Visual Basic 程序員自居,通過 for 循環的方法完成相同的任務也完全可以。

    例 16.11. map 與混合數據類型的列表

    >>> li = [5, 'a', (2, 'b')]
    >>> map(double, li)                       1
    [10, 'aa', (2, 'b', 2, 'b')]
    1 作為一個旁注,我想指出只要提供的那個函數能夠正確處理各種數據類型,map 對于混合數據類型列表的處理同樣出色。在這里,double 函數僅僅是將給定參數乘以 2,Python 則會根據參數的數據類型決定正確操作的方法。對整數而言,這意味著乘 2;對字符串而言,意味著把自身和自身連接;對于元組,意味著構建一個包括原始元組全部元素和原始元組組合在一起的新元組。

    好了,玩夠了。讓我們來看一些真實代碼。

    例 16.12. regression.py 中的 map

        filenameToModuleName = lambda f: os.path.splitext(f)[0] 1
        moduleNames = map(filenameToModuleName, files)          2
    1 正如你在 第 4.7 節 “使用 lambda 函數” 中所見,lambda 定義一個內聯函數。也正如你在 例 6.17 “分割路徑名” 中所見,os.path.splitext 接受一個文件名并返回一個元組 (name, extension)。因此 filenameToModuleName 是一個接受文件名,剝離出其擴展名,然后只返回文件名稱的函數。
    2 調用 map 將把 files 列出的所有文件名傳遞給 filenameToModuleName 函數,并且返回每個函數調用結果所組成的列表。換句話說,你剔除掉文件名的擴展名,并將剔除后的文件名存于 moduleNames 之中。

    如你在本章剩余部分將看到的,你可以將這種數據中心思想擴展到定義和執行一個容納來自很多單個測試套件的測試的一個測試套件的最終目標。

    Footnotes

    [13] 同前,我需要指出 map 可以接受一個列表、元組,或者一個像序列一樣的對象。參見前面的關于 filter 的腳注。

    97av