一文读懂reduce函数

一文读懂reduce函数

Python中的reduce函数是经常和map,filter一起被提到的函数,但是reduce的工作原理却不是那么直观,我们这里就来详细讲解一下这个函数。

首先先来看一下reduce函数的用法

import functools
functools.reduce(lambda x,y: x+y, [1, 2, 3, 4])

reduce接受的第一个参数是一个函数,第二个参数是一个列表。上面我们通过reduce函数来作了一个求和的运算,我们这里计算的是[1, 2, 3, 4]这个列表中所有元素的和。

需要注意的是,reduce的第一个参数是一个函数,这个函数接受两个参数,像上面的lambda函数有两个参数x和y,这两个参数分别代表什么意思呢?这也是很多人感到困惑的地方。这个得从reduce的工作原理说起。

reduce工作原理

对于我们上面的代码,reduce的工作原理是像下面这张图所示的

首先,reduce会计算列表中第一个和第二个元素的和,然后把这个结果和第三个元素相加,然后再把新的这个计算结果和第四个元素相加,每一次都是上一次计算的结果和下一个元素相加,所以这样就实现了求和运算。

每一次计算中,x和y分别被赋予了什么值,我们可以定义下面一个函数来看一下

def func(x, y):
    print(x, y)

然后我们把这个函数传给reduce函数的第一个参数,像下面这样

functools.reduce(func, [1, 2, 3, 4])

执行上面的代码,会看到如下的输出

1 2
None 3
None 4

可以看到,在第一次计算中,x和y被赋予了列表中的第一个和第二个元素,像下面这样

然后我们计算func(x, y),把这个结果记作第一次计算的结果。因为我们的func没有return语句,所以这里的结果是None。

然后我们进入第二次计算。在第二次计算中,x被赋予了第一次计算的结果,也就是上面算得的None,y被赋予了第三个元素的值,像下面这张图所示

然后计算func(x, y),把这个结果记作第二次计算的结果。同样的,因为func没有返回值,所以计算的结果是None。

然后我们进入第三次计算。在第三次计算中,x被赋予了第二次计算的结果,也就是上面算得的None,y被赋予了第四个元素的值,像下面这张图所示

然后计算func(x, y),把这个结果记作第三次计算的结果。因为我们已经遍历完了列表中所有的元素,这个第三次计算的结果也是我们最终的结果,就是我们reduce函数的返回值。

上面就是reduce函数的工作原理。每一次计算过程,x和y被赋予的值是什么,通过上面的图,应该也非常清楚了。

reduce举例

那理解了reduce函数的原理之后,我们再来看看怎么样用reduce函数。使用reduce函数最大的好处就是可以使代码变得非常简洁。我们来举几个例子看一下。

  1. 计算列表中所有元素的乘积
functools.reduce(lambda x, y: x*y, [1,2,3,4])

可以看到,用reduce函数,我们可以用一行代码搞定计算所有元素的积,而不用去写冗长的循环。

2. 计算列表中所有元素的最大值

functools.reduce(lambda x,y: x if x>y else y, [1,2,3,4])

3. 我们有一个列表,里面存了一个数的各位数字,比如[3, 5, 8, 1]对应的是3581的每一个数字,我们要从这个列表计算出原来的数,我们可以这样做

functools.reduce(lambda x,y: x * 10 + y, [3, 5, 8, 1])

好,以上是关于reduce用法的几个例子。

大家在使用reduce的时候,如果有一些好的例子,也欢迎在评论里补充。

编辑于 2020-04-01 20:14