返回介绍

在序列中映射函数:map

发布于 2024-01-29 22:24:16 字数 1590 浏览 0 评论 0 收藏 0

程序对列表和其他序列常常要做的一件事就是对每一个元素进行一个操作并把其结果集合起来。例如,在一个列表counter中更新所有的数字,可以简单地通过一个for循环来实现。

因为这是一个如此常见的操作,Python实际上提供了一个内置的工具,为你做了大部分的工作。map函数会对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表。如下所示。

在第13章和第14章中曾简短地介绍过map,它对一个可迭代对象中的项应用一个内置函数。这里,我们将会传入一个用户定义的函数来对它进行充分的利用,从而可以对列表中的每一个元素应用这个函数:map对每个列表中的元素都调用了inc函数,并将所有的返回值收集到一个新的列表中。别忘了,map在Python 3.0中是一个可迭代对象,因此,在这里,一个列表调用用来迫使它生成所有的结果以显示,这在Python 2.6中不是必需的。

由于map期待传入一个函数,它恰好是lambda通常出现的地方之一:

这里,函数将会为counters列表中的每一个元素加3。因为这个函数不会在其他的地方用到,所以将它写成了一行的lambda。因为这样使用map与for循环是等效的,在多编写一些的代码后,你就能够自己编写一个一般的映射工具了。

假设函数inc仍然像前面出现时那样,我们可以用内置函数或我们自己的对等形式将其映射到一个序列:

尽管如此,因为map是内置函数,它总是可用的,并总是以同样的方式工作,还有一些性能方面的优势(简而言之,它要比自己编写的for循环更快)。此外,map还有比这里介绍的更高级的使用方法。例如,提供了多个序列作为参数,它能够并行返回分别以每个序列中的元素作为函数对应参数得到的结果的列表。

对于多个序列,map期待一个N参数的函数用于N序列。这里,pow函数在每次调用中都使用了两个参数:每个传入map的序列中都取一个。尽管我们大概也能够来模拟这样做,但是当有速度优势的内置函数已经提供了这样的功能,再去模拟,意义不是很大。

注意:map调用与在第14章中学过的列表解析很相似,但是map对每一个元素都应用了函数调用而不是任意的表达式。因为这点限制,从某种意义上来说,它成为了不太通用的工具。尽管如此,在某些情况下,目前map比列表解析运行起来更快(也就是说,当映射一个内置函数时),并且它所编写的代码也较少。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文