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)                       
[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 循环的方法完成相同的任务也完全可以。

例 16.11. map 与混合数据类型的列表

>>> li = [5, 'a', (2, 'b')]
>>> map(double, li)                       
[10, 'aa', (2, 'b', 2, 'b')]
作为一个旁注,我想指出只要提供的那个函数能够正确处理各种数据类型,map 对于混合数据类型列表的处理同样出色。在这里,double 函数仅仅是将给定参数乘以 2,Python 则会根据参数的数据类型决定正确操作的方法。对整数而言,这意味着乘 2;对字符串而言,意味着把自身和自身连接;对于元组,意味着构建一个包括原始元组全部元素和原始元组组合在一起的新元组。

好了,玩够了。让我们来看一些真实代码。

例 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

[13] 同前,我需要指出 map 可以接受一个列表、元组,或者一个像序列一样的对象。参见前面的关于 filter 的脚注。

时时彩技巧的微博 内蒙古时时彩网站 时时彩编程 时时彩推广被抓 3m互助平台最新消息
华盈时时彩手机客户端 玩时时彩怎么样才稳赚 破解绑定机器码的软件 新疆福彩时时彩走势图 江西时时彩充值平台
时时彩娱乐平台代理 领先时时彩软件 易购时时彩 苏州时时彩软件 做时时彩代理需要什么条件
时时彩黑彩平台 时时彩如何定3胆 江西时时彩赚钱 江西时时彩三星杀号 老时时彩赚钱投注技巧
广东南粤风采36选7 新疆时时彩 秒速赛车是哪里的彩票 内蒙古快3直播开奖结果∷内蒙古详细地图∷内蒙古快3二同号推荐 北京pk10赛车软件
华东15选5杀号定胆 易发棋牌 时时彩平台评测 甘肃省11选5推荐 广西快乐10分开奖号码分布图
小说快捕官方下载 北京赛车pk10稳赢高手 加拿大西快乐彩开奖 江西十一选五怎么算中奖 二八杠 规则
中域国际 快3开奖结果上海今天 pk10开奖记录皇家 河南福彩22选5开奖 菲律宾二分彩