为什么以下代码不打印任何内容:
#!/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中执行上面的代码。我想我错过了一些非常基本但却无法解决的问题。
答案 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]]