filter, map和reduce在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

如果有人能给我解释一下这是为什么,我会很感激。

为进一步清晰起见,代码截图如下:


当前回答

您可以在Python 3.0新增功能中阅读有关更改。当你从2开始的时候,你应该仔细阅读它。X到3。因为已经改变了很多。

这里的全部答案都是从文档中引用的。

视图和迭代器代替列表

一些著名的api不再返回列表: […] Map()和filter()返回迭代器。如果你真的需要一个列表,一个快速的解决方法是例如list(map(…)),但更好的解决方法通常是使用一个列表理解(特别是当原始代码使用lambda时),或者重写代码,使它根本不需要列表。特别棘手的是为函数的副作用调用map();正确的转换是使用常规的for循环(因为创建列表只会浪费时间)。 […]

内置命令

[…] 减少()删除。如果你真的需要,可以使用functools.reduce();然而,在99%的情况下,显式的for循环可读性更好。 […]

其他回答

from functools import reduce

def f(x):
    return x % 2 != 0 and x % 3 != 0

print(*filter(f, range(2, 25)))
#[5, 7, 11, 13, 17, 19, 23]

def cube(x):
    return x**3
print(*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

它是这样工作的。要获得map的输出,请使用*或list

下面是Filter, map和reduce函数的例子。

数量=(10、11、12,22岁,34岁,43岁,54岁,34岁,67年,87年,88年,98年,99年,87年,44岁,66年)

/ /过滤

oddNumbers = list(lambda x: x%2 != 0, numbers)) 打印(oddNumbers)

/ /地图

multiplyOf2 = list(map(lambda x: x*2, numbers)) 打印(multiplyOf2)

/ /减少

由于reduce函数不常用,因此已从Python 3的内置函数中删除。它仍然在functools模块中可用,所以你可以这样做:

从functools导入reduce sumOfNumbers = reduce(lambda x,y: x+y, numbers) 打印(sumOfNumbers)

由于reduce方法已经从Python3的内置函数中删除,所以不要忘记在代码中导入functools。请查看下面的代码片段。

import functools
my_list = [10,15,20,25,35]
sum_numbers = functools.reduce(lambda x ,y : x+y , my_list)
print(sum_numbers)

您可以在Python 3.0新增功能中阅读有关更改。当你从2开始的时候,你应该仔细阅读它。X到3。因为已经改变了很多。

这里的全部答案都是从文档中引用的。

视图和迭代器代替列表

一些著名的api不再返回列表: […] Map()和filter()返回迭代器。如果你真的需要一个列表,一个快速的解决方法是例如list(map(…)),但更好的解决方法通常是使用一个列表理解(特别是当原始代码使用lambda时),或者重写代码,使它根本不需要列表。特别棘手的是为函数的副作用调用map();正确的转换是使用常规的for循环(因为创建列表只会浪费时间)。 […]

内置命令

[…] 减少()删除。如果你真的需要,可以使用functools.reduce();然而,在99%的情况下,显式的for循环可读性更好。 […]

map和filter的功能被有意地更改为返回迭代器,reduce从内置函数中删除并放在functools.reduce中。

因此,对于filter和map,您可以使用list()来包装它们,以便像前面那样查看结果。

>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> list(filter(f, range(2, 25)))
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x): return x*x*x
...
>>> list(map(cube, range(1, 11)))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> import functools
>>> def add(x,y): return x+y
...
>>> functools.reduce(add, range(1, 11))
55
>>>

现在的建议是用生成器表达式或列表推导式替换map和filter的使用。例子:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
...
>>> [i for i in range(2, 25) if f(i)]
[5, 7, 11, 13, 17, 19, 23]
>>> def cube(x): return x*x*x
...
>>> [cube(i) for i in range(1, 11)]
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>>

他们说for循环在99%的情况下比reduce更容易读,但我还是坚持使用functools。reduce。

编辑:99%的数据直接来自Guido van Rossum撰写的“Python 3.0新增功能”页面。