Google Python风格指南

Sch*_*tti 15 python

为什么Google Python样式指南更喜欢列表推导和for循环而不是filter,map和reduce?

不推荐使用的语言功能:..."使用列表推导和循环而不是过滤,映射和减少."

给出的解释是:"我们不使用任何不支持这些功能的Python版本,因此没有理由不使用新的样式."

Joc*_*zel 25

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]
Run Code Online (Sandbox Code Playgroud)

没有理由更喜欢地图或过滤LC.

reduce 略有不同,因为没有等效的LC,但它也没有比普通的for-loop更大的优势.

  • `map()`仍然可以说更好的规范用例是将现有的单个参数函数应用于序列,例如`map(str,seq)`.这种操作是最终为Python 3保留的原因. (10认同)

unu*_*tbu 25

谷歌的Python风格指南不说

更喜欢列表推导和循环而不是过滤,映射和减少

相反,完整的句子读,

当函数参数无论如何都是内联的lambda时,使用列表推导和for循环而不是filter和map .(我的重点)

因此,不建议您完全避免使用map,例如 - 仅限于此

[expression(item) for item in iterable] 
Run Code Online (Sandbox Code Playgroud)

比较好

map(lambda item: expression(item), iterable)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,清楚的是列表理解更直接和可读.

另一方面,使用map这样的方法没有错:

map(str, range(100))
Run Code Online (Sandbox Code Playgroud)

而不是啰嗦

[str(item) for item in range(100)]
Run Code Online (Sandbox Code Playgroud)

它很好地启动:

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)
Run Code Online (Sandbox Code Playgroud)

  • +1 用于性能比较......有趣的是,在这种情况下,地图运行得更快。 (3认同)

csc*_*hol 5

列表解析通常被认为比"Python化" filter,mapreduce.

另请参阅Python创建者Guido van Rossum 撰写的这篇文章.

至于在样式指南中的"弃用语言特性"下提交此内容,显然有计划弃用filter,map并且reduce在Python 3中(参见上面引用的文章).

其中一些计划最终改变了.reduce从一个内置的函数下降(并移动到functools模块),但filtermap仍然可用的内置插件.

  • `functools`本身是标准库的一部分."reduce()"的降级实际上只是让它不再是内置的. (2认同)