filtermapreduce在Python2中可以完美地工作.下面是一个例子:

>>> 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

如果有人能给我解释一下为什么会这样,我将不胜感激.

为更加清晰起见,代码的屏幕截图如下:

IDLE sessions of Python 2 and 3 side-by-side

推荐答案

你可以读到What's New In Python 3.0里的变化.当您从2.x版本迁移到3.x版本时,您应该仔细阅读它,因为它已经发生了很多变化.

这里的全部答案都引用了文档.

100

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

  • [.]
  • map()filter()返回迭代器.如果你真的需要一个列表,一个快速修复方法是list(map(...)),但更好的修复方法通常是使用列表理解(尤其是当原始代码使用lambda时),或者重写代码,使其完全不需要列表.特别棘手的是函数的副作用;正确的转换是使用常规的for循环(因为创建列表只会浪费时间).
  • [.]

100

  • [.]
  • 删除reduce().如果你真的需要,用functools.reduce();然而,99%的情况下,显式for循环更具可读性.
  • [.]

Python相关问答推荐

如何才能知道Python中2列表中的巧合.顺序很重要,但当1个失败时,其余的不应该失败或是0巧合

如何自动抓取以下CSV

按列分区,按另一列排序

如何在虚拟Python环境中运行Python程序?

数据抓取失败:寻求帮助

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

什么是最好的方法来切割一个相框到一个面具的第一个实例?

字符串合并语法在哪里记录

什么是合并两个embrame的最佳方法,其中一个有日期范围,另一个有日期没有任何共享列?

如何在Python中使用另一个数据框更改列值(列表)

在Python中调用变量(特别是Tkinter)

使用Python查找、替换和调整PDF中的图像'

如何在PySide/Qt QColumbnView中删除列

未调用自定义JSON编码器

ModuleNotFoundError:没有模块名为x时try 运行我的代码''

BeautifulSoup-Screper有时运行得很好,很健壮--但有时它失败了::可能这里需要一些更多的异常处理?

504未连接IB API TWS错误—即使API连接显示已接受''

如何为需要初始化的具体类实现依赖反转和接口分离?

Pandas:计数器的滚动和,复位

如何在表单中添加管理员风格的输入(PDF)