解决python 3与python 2中的map函数问题

时间:2017-08-14 16:25:51

标签: python python-3.x python-2.7 functional-programming

我对使用python进行函数式编程感兴趣,并正在使用Mary Rose Cook的博客文章 A practical introduction to functional programming

显然,它是用python 2编写的:

name_lengths = map(len, ["Mary", "Isla", "Sam"])

print name_lengths
# => [4, 4, 3]
Python 3中的

产生了这个:

<map object at 0x100b87a20>

我有两个问题:

  1. 为什么会这样?
  2. 除了converting the map object to a list and then use numpy之外,还有其他解决方案吗?

2 个答案:

答案 0 :(得分:3)

如记录所示,在migration guide

  

在Python 2中,map()返回一个列表,而在Python 3中它返回一个迭代器。

Python 2

  

将函数应用于iterable的每个项目并返回结果的列表

Python 3

  

返回一个迭代器,它将函数应用于iterable的每个项目,从而产生结果。

Python 2总是相当于list(imap(...)),Python 3允许进行惰性求值。

答案 1 :(得分:1)

要补充@dhke的优秀答案(这个评论太长了),可以这样想。您希望通过组合mapfilter等对列表执行多次转换。因此,有两种方法可以考虑这一点:

  1. 将第一个转换应用于整个列表,然后应用第二个转换等
  2. 将所有转换应用于列表的第一个元素,然后应用第二个元素等
  3. python3方式允许使用,而第二种方法不能在python 2中简洁地编写:您必须使用for循环显式迭代列表并构建新的结果列表。