【发布时间】:2016-10-13 08:01:41
【问题描述】:
我有兴趣了解new language design of Python 3.x。
我很喜欢 Python 2.7 中的函数 map:
Python 2.7.12
In[2]: map(lambda x: x+1, [1,2,3])
Out[2]: [2, 3, 4]
但是,在 Python 3.x 中,情况发生了变化:
Python 3.5.1
In[2]: map(lambda x: x+1, [1,2,3])
Out[2]: <map at 0x4218390>
我明白怎么做,但我找不到原因的参考。为什么语言设计者会做出这样的选择,在我看来,这会带来很大的痛苦。这是为了让开发人员坚持列表理解吗?
IMO,列表自然可以认为是Functors;我一直被认为是这样思考的:
fmap :: (a -> b) -> f a -> f b
【问题讨论】:
-
基本原理应该与我们使用生成器而不是列表推导的原因相同。通过使用惰性求值,我们不需要在内存中保留大量内容。在此处查看接受的答案:stackoverflow.com/questions/1303347/…
-
您能解释一下为什么这会给您带来“极大的痛苦”吗?
-
我认为这是因为多年的使用表明
map的最常见用法只是对结果进行迭代。在不需要时建立列表效率低下,因此开发人员决定让map变得懒惰。对于性能,这里有很多收获,而不是失去很多(如果您需要一份清单,只需索取一份……list(map(...)))。 -
好吧,我发现有趣的是,他们没有保留 Functor 模式并提供惰性版本的 List,而是以某种方式决定在映射时强制对列表进行惰性求值。我宁愿有权做出自己的选择,也就是 Generator -> map -> Generator 或 List -> map -> List(由我决定)
-
@NoIdeaHowToFixThis,其实由你决定,如果你需要整个列表,只需将其转换为一个列表,非常简单
标签: python python-3.x