Python地图,列表(地图),lambda和性能

By simon at 2018-02-28 • 0人收藏 • 33人看过

我一段时间以来一直是程序编程人员,只是试图切换 我的心态是使用函数式编程(在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))
为什么?我错过了什么?我知道地图返回我这是应该的terator 以节省内存,而不是仅仅保留整个列表。但是什么时候 我的超重print函数会被触发吗?

3 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

为什么?我错过了什么?我知道地图返回一个迭代器是 应该是为了节省内存,而不是仅仅持有enti重新列表。 但是,我的超重print函数何时会被触发呢? map函数是w帽子在程序员术语中是众所周知的 作为lazy。它不会做任何工作,除非它已经到了。这是更广泛的了解 如在函数式编程中作为_ [懒惰 评价](https://en.wikipedia.org/wiki/Lazyevaluation)。而不是 立即计算e任何值,则返回map函数 所谓的_ [迭代器](https://stackoverflow.com/questions/9884132 /什么,究竟 - 是 - 蟒蛇迭代器,迭代和迭代的协议)。通过 这样做,它委托计算的工作它被赋予了back的值 给你。 迭代器可以使用next来计算单个值:

>>> arr = [1, 2, 3]
>>> it = map(lambda x: print(x), arr)
>>> next(it)
1
>>> 
但是,当ñ你铸造地图迭代器是一个列表,你是强制地图 计算它的values的_all,从而调用你的函数:
>>> it = map(lambda x: print(x), arr)
>>> list(it)
1
2
3
4
[None, None, None, None]
>>> 

2018-02-28   #2

正如你所说的,你必须改变你的思维方式来使用函数式编程。 函数式编程的一个关键概念是[懒 评价](https://en.wikipedia.org/wiki/Lazyevaluation),这是 默认策略的语言如 [Haskell的](HTTPS://en.wikipedia.org/wiki/Haskell \(programming_language \))。 这项政策的目的是节省时间和内存,由calculating 只有在需要的时候。在这个意义上Python [生成器](https://wiki.python.org/moin/Generators)也是接近于 功能范式。 如果你想尽快执行它,你不应该写在一个 功能性风格如果你不关心的话,用list()修正它 结果。使用循环完全可以。

2018-02-28   #3

为什么?我错过了什么?我知道地图返回一个迭代器是 应该是为了节省内存,而不是仅仅持有enti重新列表。 但是,我的超重print函数何时会被触发呢? map函数是w帽子在程序员术语中是众所周知的 作为lazy。它不会做任何工作,除非它已经到了。这是更广泛的了解 如在函数式编程中作为_ [懒惰 评价](https://en.wikipedia.org/wiki/Lazyevaluation)。而不是 立即计算e任何值,则返回map函数 所谓的_ [迭代器](https://stackoverflow.com/questions/9884132 /什么,究竟 - 是 - 蟒蛇迭代器,迭代和迭代的协议)。通过 这样做,它委托计算的工作它被赋予了back的值 给你。 迭代器可以使用next来计算单个值:

>>> arr = [1, 2, 3]
>>> it = map(lambda x: print(x), arr)
>>> next(it)
1
>>> 
但是,当ñ你铸造地图迭代器是一个列表,你是强制地图 计算它的values的_all,从而调用你的函数:
>>> it = map(lambda x: print(x), arr)
>>> list(it)
1
2
3
4
[None, None, None, None]
>>> 

登录后方可回帖

Loading...