【问题标题】:Python map/filter/reduce with function or anonymous functionPython map/filter/reduce 函数或匿名函数
【发布时间】:2016-02-10 19:02:37
【问题描述】:

当我在命令行执行此操作时(过滤和减少相同)

map( lambda x: x+1, [1,2,3,4,5] )

结果不是列表/集合...我得到了

<map object at 0x6ffffe7b630>

要获得列表,我必须应用 list() 函数 如果我使用普通的旧函数来替换 lambda,也会发生同样的情况......

为什么会有这种行为?

【问题讨论】:

  • 强烈反对“重复”标记...我的问题有一个技术方面需要解释...您指出的问题只是说如何使用该方法...
  • 没问题,抱歉。
  • 对该问题的公认答案是“在 Python 3+ 中,许多迭代可迭代对象的进程本身返回迭代器”。这是技术原因。

标签: python collections lambda


【解决方案1】:

因为许多迭代函数使用“惰性”评估。即,他们不会立即应用该函数列表的所有元素。相反,他们使用协程在迭代“地图对象”时一次应用一个函数。

当部分(但不是全部)项目将被迭代,或者可能不需要一次全部确定时,这是一项性能特征。 lambda 仅在需要时应用。以前版本的 python 没有这种优化,而是在调用 map 后将 lambda 应用于所有内容。

【讨论】:

  • 你能证明这个函数是惰性的吗?据我所知,在map() 的情况下,算法与for 循环大不相同。前者快了大约 2.5 亿倍。在 5000 万行列表上对 map() 进行测试需要 450 ns,结果立即可用。另一方面,对相同数据执行for 循环需要大约 1.1 分钟。
  • 我同意算法不同。对于我所说的“懒惰”,可能存在一些术语误解。我的意思是它只在需要时工作。它不会遍历整个列表并在调用 map 时对每个元素应用 lambda,而是等待映射对象被迭代并将 lambda 应用于每个元素,因为迭代器会产生它。
  • 另外,以报复的方式投反对票是确保人们在您下次问为什么被投反对票时不会回复您的可靠方法。
  • 只是不同意你的回答,抱歉。我没有看到证据。我尊重你的意见,我希望你尊重我的。欢迎你不要回答。
  • 这里的懒惰是指“延迟执行直到需要”……并不是说代码不好……哈哈 ;-)
【解决方案2】:

函数map 不返回一个列表,而是一个迭代器

返回一个迭代器,它将函数应用于可迭代的每个项目,并产生结果。

documentation for map 有更多信息。

【讨论】:

  • 他们问为什么会这样,而不是输出的type() 是什么。
  • 这是一个很好的答案...只需更正链接...您在网址中粘贴了描述...哈哈!!!
  • 我今天早上显然无法粘贴。我要休息一下,谢谢 ZEE。