我已经做了一段时间的过程式程序员,只是想转换我的思维方式来使用函数式编程(目前在Python3中)。
因此,我没有编写for-each循环,而是试图掌握map
和{
假设我有一个简单的for-in
循环,它执行一些资源繁重的计算(为了简单起见,我在这里用print
替换它):
arr = [1,2,3,4]
for x in arr:
print(x)
现在,当我试着做以下事情时
^{pr2}$什么都不会发生,直到我把它包装成一个列表,它执行我的超重print
函数:
list(map(lambda x: print(x), arr))
为什么?我错过了什么?我知道map返回一个迭代器,它应该节省内存,而不是直接保存整个列表。但是我的超重print
功能什么时候会被触发呢?在
map
函数是程序员术语中通常所说的lazy。它不会做任何工作,除非必须。这在函数式编程中被称为lazy evaluation。map
函数不是立即计算任何值,而是返回称为iterator的值。通过这样做,它把计算它的值的工作委托给你。在迭代器可以使用
next
计算单个值:但是,当您将map迭代器强制转换为list时,您强制map计算其所有值,并因此调用函数:
^{pr2}$正如你所说,你必须改变你的思维方式来使用函数式编程。函数式编程的一个关键概念是lazy evaluation,这是Haskell等语言中的默认策略。在
此策略的目的是通过仅在需要时计算某些内容来节省时间和内存。从这个意义上讲,Pythongenerators也接近函数范式。在
如果您想尽快执行它,那么如果您不关心结果,就不应该以函数样式编写它并用
list()
来修复它。使用循环是完全可以的。在相关问题 更多 >
编程相关推荐