9

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

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))

新行上的预期操作:Hello Hello Hello Hello Hello

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

4

3 回答 3

33

在 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

或者其他各种各样的东西。

于 2013-10-13T05:59:00.623 回答
6

Python 3 的map函数是惰性的,不像 Python 2 的map.

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

for result in map(...):
    pass

Python3中地图的非懒惰评估版本?突出了一些更优雅的解决方案。

于 2013-10-13T05:59:22.110 回答
2

您使用的是 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

准确地展示发生了什么——就像我为你所做的那样。

于 2013-10-13T05:59:45.687 回答