30

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

#!/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 中执行上面的代码。我想我错过了一些非常基本但无法弄清楚的东西。

4

3 回答 3

56

map()返回一个迭代器,并且在您要求之前不会处理元素。

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

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

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

from collections import deque

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

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

for i in range(10):
    self.do_someting(i)
于 2012-11-29T10:28:07.527 回答
7

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

list() 通过迭代其参数来创建一个新列表。( list() 不仅仅是从说元组到列表的类型转换。所以 list(list((1,2))) 返回 [1,2]。)所以 list(map(...)) 向后兼容蟒蛇 2.7。

于 2013-10-05T11:37:15.707 回答
2

我只想添加以下内容:

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]]
于 2014-07-27T13:19:41.190 回答