Python中的Map和列表推导式有什么区别?

4
什么时候应该使用 map/filter 而不是列表推导或生成器表达式?
2个回答

8

1

列表推导式和生成器表达式通常被认为是更具Python风格的。在编写Python代码时,最好使用列表推导式和生成器表达式,因为这是Python程序员倾向于做事情的方式。

map和filter都返回与列表推导式相同的列表对象。生成器表达式返回一个生成器。使用生成器,计算仅在需要时发生,而不是计算和存储结果。如果输入大小较大,则可以减少内存使用。此外,请记住,生成器不可索引。必须按顺序从中读取。

以下是使用不同方法转换数字序列并使用列表推导式、生成器表达式和map对它们进行求和时,内存使用情况会有所不同的一些示例。

k=1000

def transform(input):
    return input + 1

"""
  1. range(k) allocates a k element list [0...k]
  2. Iterate over each element in that list and compute the transform
  3. Store the results in a list
  4. Pass the list to sum

Memory: Allocates enough 2 lists of size k
"""
print sum([transform(i) for i in range(k)])

"""
  1. Create an xrange object
  2. Pass transform and xrange object to map
  3. Map returns a list of results [1...k+1]
  4. Pass list to sum

Memory: Creates a constant size object and creates a list of size k
"""
print sum(map(transform, xrange(k)))

"""
  1. Create an xrange object
  2. Create a generator object
  3. Pass generator object to sum

Memory: Allocates 2 objects of constant size
"""
print sum(transform(i) for i in xrange(k))

"""
Create a generator object and operate on it directly
"""
g = (transform(i) for i in xrange(k))
print dir(g)
print g.next()
print g.next()
print g.next()

"Map和filter来自更多的函数式语言。列表推导式也是如此(受Haskell中该特性的启发),生成器表达式则源于列表推导式,实际上更像是在非严格函数式语言中执行的操作。" - Mike Graham
我知道这些定义是什么。我想知道为什么你会选择使用 map 而不是列表推导式的原因。 - hekevintran
我的措辞不太好,所以我删掉了它。根据我的经验,在函数式语言(尽管是严格的函数式语言)中,map/filter 的使用比列表推导更多,只是因为列表推导会在 map/filter 之上增加语法糖,而且我知道许多语言都试图限制皮毛的数量。 - Evan
1
当我写Python时,我总是使用列表推导式而不是map函数。 - Evan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接