为什么Google Python Style Guide更喜欢列表推导和for循环而不是filter,map和reduce?
弃用的语言功能: ...“使用列表推导和循环而不是过滤,映射和减少。”
给出的解释是:“我们不使用任何不支持这些功能的Python版本,因此没有理由不使用新的样式。”
答案 0 :(得分:24)
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]
没有理由更喜欢地图或过滤LC。
reduce
略有不同,因为没有等效的LC,但它没有比普通的for循环更大的优势。
答案 1 :(得分:23)
更喜欢列表推导和for循环而不是filter,map和 减少
相反,完整的句子读取,
使用列表推导和for循环而不是过滤和映射时 函数参数无论如何都是内联的lambda 。 (我的重点)
因此,建议您不要完全避免使用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)
答案 2 :(得分:5)
列表推导通常被认为比filter
,map
和reduce
更加“pythonic”。
请参阅Python创建者Guido van Rossum的这篇article。
至于在样式指南中的“弃用语言功能”下提交此内容,显然有计划在Python 3中弃用filter
,map
和reduce
(请参阅{{ 3}}以上引用)。
其中一些计划最终改变了。 reduce
已从内置函数中删除(并移至article
模块),但filter
和map
仍为functools内置函数
答案 3 :(得分:4)
我认为这是因为不是每个人都知道如何很好地使用这些功能;对于不那么熟悉的人,可读性可能会受损。此外,for
循环和列表理解被广泛使用且易于理解;即使后者来自函数式编程,就像map
,filter
和reduce
一样,它很好地反映了列表和for
循环。在任何情况下,填充lambda或定义一个仅用于map,filter或reduce的函数都会变得烦人,特别是因为lambda只能是单个表达式而函数可能会混乱你的代码。反正你不需要它们; map(func, seq)
只是[func(x) for x in seq]
而filter
只是一个包含if
组件的列表理解。可以使用reduce
循环来完成for
。
简而言之,for
和列表推导更清晰,在大多数情况下它们提供基本相同的功能。