Python:映射调用函数不起作用

时间:2013-10-13 05:50:06

标签: python map functional-programming

映射不调用正在传递的函数。

class a:
    def getDateTimeStat(self,datetimeObj):
        print("Hello")

if __name__ == "__main__":
    obj = a()
    print("prog started")
    data = [1,2,3,4,5]
    b = list(map(obj.getDateTimeStat,data))

新线上的预期操作:     你好     你好     你好     你好     你好

任何帮助将不胜感激....

3 个答案:

答案 0 :(得分:14)

在Python 3中,懒惰地评估地图值。也就是说,每个值仅在需要时计算。你会发现,无论你使用什么函数,在你在映射结果中询问该项的值时都不会被调用,无论是使用next()还是其他方式。

要获得你想要的东西,你可以这样做:

>>> b = map(obj.getDateTimeStat,data)
>>> next(b)
Hello
>>> next(b)
Hello
>>> next(b)
Hello
>>> next(b)
Hello
>>> next(b)
Hello
>>> next(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

或者这个:

>>> b = list(map(obj.getDateTimeStat,data))
Hello
Hello
Hello
Hello
Hello

或其他各种事情。

答案 1 :(得分:2)

Python 3的map函数是懒惰的,与Python 2的map不同。

你必须以某种方式消费它:

for result in map(...):
    pass

Non-lazy evaluation version of map in Python3?突出了一些更优雅的解决方案。

答案 2 :(得分:1)

你正在使用Python 3,对吗? map()在Python 3中返回一个迭代器,而不是列表。因此,使用任何方法强制迭代器产生结果;例如,

b = list(map(obj.getDateTimeStat,data))

后来

这里我正在运行您问题中当前的确切代码:

class a:
    def getDateTimeStat(self,datetimeObj):
        print("Hello")

if __name__ == "__main__":
    obj = a()
    print("prog started")
    data = [1,2,3,4,5]
    b = list(map(obj.getDateTimeStat,data))

这是输出:

$ python -V
Python 3.3.2

$ python yyy.py
prog started
Hello
Hello
Hello
Hello
Hello

显示完全会发生什么 - 正如我为你所做的那样。