【发布时间】:2018-02-26 22:05:28
【问题描述】:
我做程序程序员已经有一段时间了,只是想改变我的思维方式来使用函数式编程(目前在 Python 3 中)。
因此,我没有编写 for-each 循环,而是试图掌握 map 和 list(map(..)) 之间的交互
假设我有一个简单的 for-in 循环,它执行一些资源繁重的计算(为了简单起见,我将在此处替换为 print):
arr = [1,2,3,4]
for x in arr:
print(x)
现在,当我尝试执行以下操作时
map(lambda x: print(x), arr)
什么都没有发生,直到,我将它包装在一个列表中,它完成了我的超重 print 功能:
list(map(lambda x: print(x), arr))
为什么?我错过了什么?我知道 map 返回一个迭代器,它应该可以节省内存,而不是立即保存整个列表。但是我的超重print函数什么时候才能触发呢?
【问题讨论】:
-
好的,我理解这些概念,它们对我来说并不陌生。我的问题是,为什么当我不应用
list包装器时该功能不起作用?因为我必须通过迭代器来触发它? -
是的@OgnjenMišić。
map就是大家常说的懒惰。它不会做任何工作(即调用你的函数来计算任何值),除非它必须。您可以使用next强制 map 计算单个值。但是,当您将map迭代器转换为list时,您强制map计算其所有值并因此调用您的函数。 -
因为它不会返回值列表。它返回迭代器本身。然后你在它上面调用
next(some_iterator)来消费下一个值,一个接一个。直到所有值都被消耗完。对它应用list将使它适用于所有值并返回一个包含所有迭代器值的列表。或者你可以使用 for 循环 -
好的,试了一下,谢谢大家,现在清楚多了。 @ChristianDean 发布您的回复,以便我接受 :)
-
坦率地说,我原以为它可以像 JS 版本的地图一样工作,但现在又说得通了。
标签: python lambda functional-programming