Python 3 Map函数不是Calling up函数

时间:2012-11-29 10:26:08

标签: python python-3.x functional-programming map-function

为什么以下代码不打印任何内容:

#!/usr/bin/python3
class test:
    def do_someting(self,value):
        print(value)
        return value

    def fun1(self):
        map(self.do_someting,range(10))

if __name__=="__main__":
    t = test()
    t.fun1()

我正在Python 3中执行上面的代码。我想我错过了一些非常基本但却无法解决的问题。

3 个答案:

答案 0 :(得分:28)

map() returns an iterator,在您要求之前不会处理元素。

将其转换为列表以强制处理所有元素:

list(map(self.do_someting,range(10)))

或使用长度设置为0的collections.deque(),如果您不需要地图输出,则不会生成列表:

from collections import deque

deque(map(self.do_someting, range(10)))

但请注意,对于代码的任何未来维护者来说,简单地使用for循环更具可读性:

for i in range(10):
    self.do_someting(i)

答案 1 :(得分:3)

在Python 3之前,map()返回了一个列表,而不是一个迭代器。所以你的例子可以在Python 2.7中使用。

list()通过遍历其参数来创建新列表。 (list()不是从元组到列表的类型转换。所以list(list((1,2)))返回[1,2]。)所以list(map(...))向后兼容Python 2.7。

答案 2 :(得分:1)

我只想添加以下内容:

With multiple iterables, the iterator stops when the shortest iterable is exhausted [https://docs.python.org/3.4/library/functions.html#map]

Python 2.7.6(默认,2014年3月22日,22:59:56)

>>> list(map(lambda a, b: [a, b], [1, 2, 3], ['a', 'b']))
[[1, 'a'], [2, 'b'], [3, None]]

Python 3.4.0(默认,2014年4月11日,13:05:11)

>>> list(map(lambda a, b: [a, b], [1, 2, 3], ['a', 'b']))
[[1, 'a'], [2, 'b']]

这种差异使得list(...)简单包装的答案不完全正确

同样可以通过以下方式实现:

>>> import itertools
>>> [[a, b] for a, b in itertools.zip_longest([1, 2, 3], ['a', 'b'])]
[[1, 'a'], [2, 'b'], [3, None]]