谷歌Python风格指南

21 投票
4 回答
11437 浏览
提问于 2025-04-16 14:22

为什么谷歌的Python风格指南更喜欢使用列表推导式和for循环,而不是filter、map和reduce呢?

被弃用的语言特性:
... "使用列表推导式和for循环,而不是filter、map和reduce。"

给出的解释是:“我们不使用任何不支持这些特性的Python版本,所以没有理由不使用新的风格。”

4 个回答

5

列表推导式通常被认为比 filtermapreduce 更“符合Python风格”。

你可以看看这篇由Python创始人Guido van Rossum写的 文章

在风格指南中把这些归类为“已弃用的语言特性”,显然曾经有计划在Python 3中弃用 filtermapreduce(可以参考上面的 文章)。

不过,后来这些计划发生了一些变化。reduce 被移除了作为内置函数(现在放在 functools 模块里),但 filtermap 仍然可以作为内置函数使用 可用

35

谷歌的Python风格指南并没有说

要更喜欢列表推导和for循环,而不是filter、map和reduce。

实际上,完整的句子是:

在函数参数本来就是一个内联的lambda函数时,使用列表推导和for循环,而不是filter和map。(我强调的部分)

所以,它并不是建议你完全不使用map,而只是说

[expression(item) for item in iterable] 

比起

map(lambda item: expression(item), iterable)

在这种情况下,列表推导显得更直接、更易读。

另一方面,像这样使用map也是没问题的:

map(str, range(100))

而不是更冗长的写法

[str(item) for item in range(100)]

而且它的性能也很好:

In [211]: %timeit list(map(str,range(100)))
7.81 µs ± 151 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

In [215]: %timeit [str(item) for item in range(100)]
10.3 µs ± 3.06 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
31

mapfilter的功能远不如列表推导式(LC)强大。列表推导式可以在一步中同时进行过滤和映射,它们不需要明确的函数,并且由于其特殊的语法,可以更高效地编译。

# map and filter
map(lambda x:x+1, filter(lambda x:x%3, range(10)))
# same as LC
[x+1 for x in range(10) if x%3]

其实没有理由去偏好使用map或filter,而不是使用列表推导式。

reduce稍微不同,因为没有对应的列表推导式,但它也没有比普通的for循环更大的优势。

撰写回答