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

filter,,map并且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.0新增功能中阅读有关更改的信息。从2.x升级到3.x时,你应该仔细阅读它,因为已经做了很多更改。

此处的完整答案是文档中的引号。

视图和迭代器而不是列表

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

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

内建

  • […]
  • 已删除reduce()。functools.reduce()如果确实需要,请使用;但是,在99%的情况下,显式for循环更易于阅读。
  • […]

以上是 如何在Python 3中使用过滤,映射和归约 的全部内容, 来源链接: utcz.com/qa/409728.html

回到顶部