filter
、map
和reduce
在Python2中工作得非常好。以下是一个例子:
>&燃气轮机&燃气轮机;def f(x):
返回x%2!=0和x%3!=0
&燃气轮机&燃气轮机&燃气轮机;过滤器(f,量程(2,25))
[5, 7, 11, 13, 17, 19, 23]
&燃气轮机&燃气轮机&燃气轮机;def多维数据集(x):
返回x*x*x
&燃气轮机&燃气轮机&燃气轮机;地图(立方体,范围(1,11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
&燃气轮机&燃气轮机&燃气轮机;def添加(x,y):
返回x+y
&燃气轮机&燃气轮机&燃气轮机;减少(增加,范围(1,11))
55
但在Python 3中,我收到以下输出:
>&燃气轮机&燃气轮机;过滤器(f,量程(2,25))
<;0x0000000002C14908处的筛选对象>;
&燃气轮机&燃气轮机&燃气轮机;地图(立方体,范围(1,11))
<;将对象映射到0x0000000002C82B70>;
&燃气轮机&燃气轮机&燃气轮机;减少(增加,范围(1,11))
回溯(最近一次呼叫最后一次):
文件“<;pyshell#8>;”,第1行,在<;模块>;
减少(增加,范围(1,11))
NameError:未定义名称“reduce”
如果有人能向我解释这是为什么,我将不胜感激
为进一步清晰起见,代码截图:
您可以阅读Python3.0中新增内容的变化。当你从2.x移动到3.x时,你应该仔细阅读它,因为很多东西已经改变了
这里的全部答案都引用了文档
视图和迭代器而不是列表
一些著名的API不再返回列表:
- [……]
map()
和filter()
返回迭代器。如果你真的需要一个列表,一个快速修复方法是,例如,list(map(…))
,但更好的修复方法通常是使用列表理解(特别是当原始代码使用lambda时),或者重写代码,使其根本不需要列表。特别棘手的是map()
调用函数的副作用;正确的转换是使用常规的for
循环(因为创建列表只会浪费时间)- [……]
内置式
- [……]
- 已删除
reduce()
。如果您确实需要,请使用functools.reduce()
;但是,99%的时候,显式for
循环更具可读性- [……]