【问题标题】:Where to use the core-python map function?在哪里使用 core-python 地图功能?
【发布时间】:2019-05-18 21:55:34
【问题描述】:

高效构建的最佳方法是了解构建时使用的工具包。然而,在尝试理解 python 的核心函数时,我突然想到 map 函数给出了与通用生成器表达式相似的结果。

以下一段代码为例。 这两个对象,映射和生成,在你扔它们的任何情况下都表现得惊人的相似。

def concatenate(string1 = "", string2 = ""):
    return string1.join(" ", string2)

foo = ["One", "Two"]
bar = ["Blue", "Green"]

mapped = map(concatenate, foo, bar)
generated = (concatenate(string1 = a, string2 = b) for a, b in zip(foo, bar))

好吧,我知道这是一行更长的代码,但我很难相信这就是 map 存在的全部原因,所以在我寻求理解 python 的过程中。 map 在 python 中还能做什么?它真的只是旧时代的遗物吗?如果不是,我在哪里可以最好地使用这个工具?

【问题讨论】:

  • Map 基本上被替换为列表理解。它仍然作为一些用途(用于特殊情况),但它主要已被 python 3 中的列表理解所取代。有些人更喜欢使用 map,因为这是他们熟悉的,但基本上它只是遗留问题。
  • 嗯,但这并没有打破蟒蛇的禅宗:“应该有一种——最好只有一种——明显的方式来做到这一点。”如果是这样,那为什么开发者不选择在 python 3 中排除它呢?保留它只会增加混乱。请问有什么特殊情况吗?

标签: python-3.x mapping generator


【解决方案1】:

两者都存在的原因是因为列表推导返回一个新的list,而map(在Python3中)返回一个generator,因此map在不需要生成的list时内存效率更高马上。

这可以被认为是一种技术性,因为通常当您使用列表推导来执行地图可以执行的操作时,您会覆盖原始变量:

a = [1, 2, 3]
# The following line creates a new list but
# since we assign that list to `a` we give the old list to 
# the garbage collector
a = [x**2 for x in a]
# or
a = list(map(lambda x: x**2, a))
# both of which are basically the same.

如果您不使用相同的变量,地图的力量就会发挥作用:

a = [1, 2, 3] # If we want to save this then we don't want to overwrite it
b = [x**2 for x in a] # A full new list is now in b
c = map(lambda x: x**2, a) # c is just a generator object.
print(a) # [1, 2, 3]
print(b) # [1, 4, 9]
print(c) # <map object ...>
for x in c:
    print(x) 
    # We never create a full list from c, we just use each object as we go thus we save memory.

在前面的示例中,b 是一个全新的内存list,而c 只是一个生成器对象。当使用如此小的a 时,bc 在内存中可能非常接近,但如果a 很大,c 的内存将明显少于b

map 最常见的用例涉及第一种情况,因此map 没有真正的好处,但在第二种情况下,使用map 更有好处。

为了记录,禅宗中的“做某事的一种方法”有点模糊。我可以以正确的方式实现合并排序(即完美的速度和空间),但我的代码看起来与其他实现合并排序的人完全不同。 “一种方式”实际上并不意味着只有一种编码方式,它更多地意味着只有一种方法可以使用或一种流程。

【讨论】:

  • 首先,感谢您的广泛回答并原谅我尚未接受它。但是,我仍然有一个问题。介意我问吗?实际上,在使用列表推导时,它会创建一个列表。但是, map 与使用生成器理解有何不同,例如。用圆括号替换方括号?因为这将创建一个相似的(如果不相同的话)对象...
  • 啊,这确实是一个关于python zen 的特定行的有趣视图。我曾经听过这样的说法:“在Python中,一行逻辑等于一行代码。从这个角度看禅,我觉得这行意味着不应该有两种简单明了的方法来完成同一行逻辑,从而避免编码者和代码阅读者在阅读代码时的精神斗争。
  • 好问题,我忘了说。见stackoverflow.com/q/1247486/8150685
  • 这确实消除了我的困惑,感谢您的时间和精力!
猜你喜欢
  • 2013-08-29
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-23
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多