谷歌Python风格指南
为什么谷歌的Python风格指南更喜欢使用列表推导式和for循环,而不是filter、map和reduce呢?
被弃用的语言特性:
... "使用列表推导式和for循环,而不是filter、map和reduce。"
给出的解释是:“我们不使用任何不支持这些特性的Python版本,所以没有理由不使用新的风格。”
4 个回答
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
map
和filter
的功能远不如列表推导式(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循环更大的优势。