Python 3 Map函数不是Calling up函数

Sib*_*ibi 19 python functional-programming python-3.x 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()
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 35

map()返回一个迭代器,在你要求之前不会处理元素.

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

list(map(self.do_someting,range(10)))
Run Code Online (Sandbox Code Playgroud)

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

from collections import deque

deque(map(self.do_someting, range(10)))
Run Code Online (Sandbox Code Playgroud)

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

for i in range(10):
    self.do_someting(i)
Run Code Online (Sandbox Code Playgroud)

  • @JonClements:OP正在玩地图功能,并创建了一小段示例代码,以表明事情没有像他预期的那样工作,我会说. (3认同)
  • 我会说,创建临时列表不是最好的事情.**`consume` [食谱](http://docs.python.org/3/library/itertools.html#itertools-recipes)**可能会更好. (3认同)
  • @MarSoft:在不创建列表的情况下使用的最佳方法是使用`collections.deque(iterator,maxlen = 0)`; `all()`要求所有值都为*True*; 例如,如果你产生`None`值`all()`早退出. (3认同)
  • 此外,OP可能只是缺少一个`return`,但通常不认为使用`map`重复执行副作用(在本例中为'print`)而不是使用结果集是一种好习惯. ... (2认同)
  • 请注意,使用“maxlen=0”创建“collection.deque”相当于调用“itertools.consume”。然而,后者对我来说更具可读性,因为很明显您想要使用迭代器。 (2认同)

boo*_*chk 5

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

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