【问题标题】:Why map is not executing a function in python 3为什么map没有在python 3中执行函数
【发布时间】:2017-09-03 12:39:02
【问题描述】:

我写了一个下面的小python程序

def abc(x):
    print(x)

然后调用 地图(abc, [1,2,3])

但是上面的地图功能刚刚显示出来

<map object at 0x0000000001F0BC88>

而不是打印 x 值。

我知道 map 是 python 3 中的迭代器,但它仍然应该正确打印 'x' 值。是不是说我们使用map的时候没有调用abc(x)方法?

【问题讨论】:

  • 正确使用地图时应该打印'x'值,但在地图上调用列表时不会打印'x'值。
  • 因为我们使用 map 调用 abc 函数,而不是使用 list 函数
  • 参见:stackoverflow.com/q/20535342/5647260 因为maprange 在技术上是生成器。

标签: python-3.x


【解决方案1】:

map 迭代器会延迟计算这些值,因此在迭代它们之前您不会看到输出。这是一种可以将值打印出来的显式方法:

def abc(x):
    print(x)
it = map(abc, [1,2,3])
next(it)
next(it)
next(it)

next 函数调用it.__next__ 以步进到下一个值。当您使用 for i in it: # do something 或从迭代器 list(it) 构造列表时,这是在后台使用的,因此执行这些操作中的任何一个也会打印出值。

那么,为什么要懒惰呢?当处理非常大或无限的序列时,它会派上用场。想象一下,如果不是将[1,2,3] 传递给映射,而是将itertools.count() 传递给它。惰性允许您仍然迭代生成的地图,而无需尝试预先生成所有(并且有无限多个)值。

【讨论】:

    【解决方案2】:

    惰性评估

    Python3 中的map(或range 等)是惰性求值:它会在您需要时求值。

    如果你想要地图的结果,你可以使用:

    list(map(abc, [1,2,3]))
    

    【讨论】:

      猜你喜欢
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多