如何在 Python 3 中使用过滤器、映射和归约

2023-12-05

这就是我习惯的方式filter, map, and reduce在 Python 2 中工作:

>>> def f(x):
        return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

>>> def cube(x):
        return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

>>> def add(x,y):
        return x+y
>>> reduce(add, range(1, 11))
55

然而,所有这些似乎在 Python 3 中都被打破了:

>>> filter(f, range(2, 25))
<filter object at 0x0000000002C14908>

>>> map(cube, range(1, 11))
<map object at 0x0000000002C82B70>

>>> reduce(add, range(1, 11))
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    reduce(add, range(1, 11))
NameError: name 'reduce' is not defined

为什么结果不同?如何让 Python 3 代码像 Python 2 代码一样工作?


See also: What is the problem with reduce()? for specific motivation for the change to put reduce into a standard library module rather than leaving it as a builtin.


您可以阅读有关更改的信息Python 3.0 的新增功能。当您从 2.x 迁移到 3.x 时,您应该仔细阅读它,因为发生了很多变化。

这里的整个答案都是来自文档的引用。

使用视图和迭代器代替列表

一些知名的 API 不再返回列表:

  • [...]
  • map() and filter()返回迭代器。如果您确实需要一个列表,可以快速解决,例如list(map(...)),但更好的解决方法通常是使用列表理解(尤其是当原始代码使用 lambda 时),或者重写代码,使其根本不需要列表。特别棘手的是map()因函数的副作用而调用;正确的转换是使用常规的for循环(因为创建列表只是浪费)。
  • [...]

Builtins

  • [...]
  • Removed reduce(). Use functools.reduce()如果你真的需要它;然而,99%的情况下,明确的for循环更具可读性。
  • [...]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python 3 中使用过滤器、映射和归约 的相关文章

随机推荐