python 地图、列表(地图)、lambda 和性能

Ogn*_*šić 0 python lambda functional-programming

我已经做了一段时间的程序程序员,只是试图将我的思维方式转变为使用函数式编程(目前在 Python 3 中)。因此,我没有编写 for-each 循环,而是试图掌握maplist(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功能什么时候会被触发呢?

Chr*_*ean 5

为什么?我错过了什么?我知道 map 返回一个迭代器,它应该节省内存,而不是立即保存整个列表。但是我的超重print功能什么时候会被触发呢?

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)