如何在Python3中使用filter、map和reduce

filtermapreduce在Python2中工作得非常好。以下是一个例子:

&gt&燃气轮机&燃气轮机;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中,我收到以下输出:

&gt&燃气轮机&燃气轮机;过滤器(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循环更具可读性
  • [……]

发表评论