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
如果有人能解释一下原因,我将不胜感激。
为了进一步清晰起见,代码截图:
作为其他答案的补充,这听起来像是上下文管理器的一个很好的用例,它将这些函数的名称重新映射到返回列表并在全局命名空间中引入
reduce
的函数。快速实现可能如下所示:
用法如下:
打印内容:
就我的2美分:-)
您可以阅读What's New In Python 3.0中的更改。当你从2.x移到3.x时,你应该仔细阅读它,因为很多东西已经改变了。
这里的全部答案都是从文档中引用的。
Views And Iterators Instead Of Lists
Builtins
有意将
map
和filter
的功能更改为返回迭代器,并将reduce从内置中移除并放置在functools.reduce
中。因此,对于
filter
和map
,您可以用list()
来包装它们,以便像以前一样查看结果。现在的建议是用生成器表达式或列表理解替换map和filter的用法。示例:
他们说for循环99%的时间比reduce更容易阅读,但我还是坚持使用
functools.reduce
。编辑:99%的数据直接从Guido van Rossum编写的What’s New In Python 3.0页面中提取。
相关问题 更多 >
编程相关推荐