Ogn*_*šić 0 python lambda functional-programming
我已经做了一段时间的程序程序员,只是试图将我的思维方式转变为使用函数式编程(目前在 Python 3 中)。因此,我没有编写 for-each 循环,而是试图掌握map和list(map(..))
假设我有一个简单的for-in循环,它执行一些资源繁重的计算(print为了简单起见,我将在此处替换):
arr = [1,2,3,4]
for x in arr:
print(x)
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试执行以下操作时
map(lambda x: print(x), arr)
Run Code Online (Sandbox Code Playgroud)
什么也没发生,直到,我把它包装在一个列表中,它完成了我的超重print功能:
list(map(lambda x: print(x), arr))
Run Code Online (Sandbox Code Playgroud)
为什么?我错过了什么?我知道 map 返回一个迭代器,它应该节省内存,而不是立即保存整个列表。但是我的超重print功能什么时候会被触发呢?
为什么?我错过了什么?我知道 map 返回一个迭代器,它应该节省内存,而不是立即保存整个列表。但是我的超重
该map函数在程序员术语中通常称为lazy。除非必须,否则它不会做任何工作。这在函数式编程中被更广泛地称为惰性求值。该map函数不是立即计算任何值,而是返回所谓的迭代器。通过这样做,它委派了计算返回给您的值的工作。
迭代器可以使用next以下方法计算单个值:
>>> arr = [1, 2, 3]
>>> it = map(lambda x: print(x), arr)
>>> next(it)
1
>>>
Run Code Online (Sandbox Code Playgroud)
但是,当您将 map 迭代器转换为列表时,您是在强制 map 计算其所有值,从而调用您的函数:
>>> it = map(lambda x: print(x), arr)
>>> list(it)
1
2
3
4
[None, None, None, None]
>>>
Run Code Online (Sandbox Code Playgroud)