导航: 起始页 > Dive Into Python > 有效编程(Functional Programming) > 关联已访问列表 | << >> | ||||
Python 研究(Dive Into Python)Python 从新手到高手 [DIP_5_4_CPUG_RELEASE] |
例 16.10. 介绍 map
>>> 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 接受一个函数和一个列表作为参数,[8] 并以列表中每个元素顺序地调用函数返回一个新的列表。 在这个例子中,函数仅仅是将每个元素乘以2。 | |
使用列表遍历的方法你可以做到相同的事情。 列表遍历是在 Python 2.0版时被引入的,map 便从此永远盘桓。 | |
你如果坚持以 Visual Basic 程序员而自居,通过 for 循环的方法完成相同的任务也完全可以。 |
例 16.11. map 与混合数据类型的列表
>>> li = [5, 'a', (2, 'b')] >>> map(double, li) [10, 'aa', (2, 'b', 2, 'b')]
好了,玩够了。让我们来看一些真实代码。
例 16.12. regression.py 中的 map
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 之中。 |
如你在本章剩余部分将看到的,你可以将这种数据中心思想扩展应用到定义和执行一个容纳来自很多单个测试套件的测试的一个测试套件的最终目标。
Footnotes
[8] 同前,我需要指出 map 可以接受一个列标、元组,或者一个像序列一样的对象。参见前面的关于 filter 的脚注。
<< 过滤已访问列表 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
数据中心思想编程 >> |