为什么不下面的代码打印任何东西:
#!/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.我觉得我失去了一些东西很基本的,但没能弄明白。
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)
Python 3中之前,图()返回一个列表,而不是一个迭代器。 所以,你的例子就是在Python 2.7的工作。
列表()通过遍历其参数创建一个新的列表。 (列表()不只是一个类型转换从说元组到列表,所以列表(列表((1,2)))返回[1,2])。因此列表(地图(...))是具有向下兼容Python 2.7版。
我只想补充以下内容:
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]]