如何在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