使用函数或匿名函数的 Python map/filter/reduce

3
当我在命令行中执行此操作(过滤和缩减同理)
map( lambda x: x+1, [1,2,3,4,5] )

结果并非列表/集合,而是:

<map object at 0x6ffffe7b630>

如果要获得列表,需要应用list()函数。同样的情况也会发生在使用普通函数替换lambda时...

为什么会出现这种行为?


非常不同意“重复标记”...我的问题有一个需要解释的技术方面...你指出的那个问题只是说明如何使用方法... - ZEE
没问题,抱歉。 - alecxe
1
那个问题的被接受答案说:“在Python 3+中,许多迭代可迭代过程返回迭代器本身”。这是技术原因。 - tdelaney
2个回答

2
由于许多迭代函数使用“惰性”评估,因此需要注意。也就是说,它们不会立即应用函数到列表的所有元素中,而是使用协程在“映射对象”被迭代时逐个应用该函数。
当某些(但不是全部)项将被迭代,或者可能不需要一次性确定所有项时,这是一种性能特征。Lambda仅在需要时应用。以前的Python版本没有这种优化,而是在调用“map”时立即将lambda应用于所有内容。

你能提供一下这个函数是惰性求值的证明吗?据我所知,在map()的情况下,算法与for循环有很大不同。前者快了约2.5亿倍。对于一个包含5000万行的列表进行map()测试只需要450纳秒,并且结果立即可用。而在相同数据上运行for循环则需要1.1分钟。 - Pouria
我同意算法是不同的。可能有一些术语上的误解,关于我所说的“懒惰”。我的意思是它只在需要时才工作。当调用map时,它不会循环整个列表并在每个元素上应用lambda,而是等待迭代器被迭代,并在迭代器产生每个元素时将lambda应用于该元素。 - Chad S.
此外,出于报复而进行的负评是确保人们不会在下次你问为什么被负评时回应你的一种可靠方式。 - Chad S.
抱歉,我不同意你的答案。我没有看到证据。我尊重你的观点,也希望你尊重我的。如果你不想回答也可以。 - Pouria
这里的“懒惰”意味着“延迟执行直到需要”……并不是代码不好……哈哈;-) - ZEE
显示剩余2条评论

1
map函数并不返回一个列表,而是一个迭代器。
返回一个迭代器,该迭代器将函数应用于可迭代对象的每个元素,并产生结果。 map文档提供了更多信息。

他们问为什么会发生这种情况,而不是输出的“type()”是什么。 - Pouria
1
这是一个很好的回答...只需要更正链接...你把描述粘贴到了URL中...哈哈哈!!! - ZEE
今天早上似乎无法粘贴。我要休息一下,谢谢ZEE。 - Michal Frystacky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接