Python reduce()函数用法详解与示例
本文详解Python内置高阶函数reduce()的用法。介绍其格式reduce(func, seq[, init])及执行流程,通过阶乘和列表求和两个实例说明无init与有init参数的区别。强调func需接收两参数,并对比sum()函数,展示如何利用reduce实现累加与累乘操作。
reduce()是Python内置的一个高阶函数。
reduce()函数
函数格式如下:
reduce(func, seq[, init])
reduce()被称为化简函数,其执行逻辑为:每次迭代时,将上一次迭代的结果(若为首次迭代且未指定init则为序列seq的第一个元素)与序列中的下一个元素共同传入二元函数func中执行。参数init为可选,若提供则作为首次迭代的第一个元素;若未提供,则默认使用seq的第一个元素。

从reduce函数的执行流程可以看出,它非常适合用于计算阶乘。Python标准库中虽未直接提供求阶乘的内置函数,但我们可以利用reduce函数轻松实现这一功能。
#未指定init的情况 >>> n = 6 >>> print reduce(lambda x, y: x * y, range(1, n)) 120
在上述示例中,range(1, 6)生成了列表[1, 2, 3, 4, 5],此处将其命名为seq1。由于未指定init参数,reduce()取seq1的第一个元素1作为初始值。因lambda表达式包含两个变量,故需传入两个实参,即取seq1的第二个元素2与初始值1一同传入lambda执行,返回结果2。随后,该结果与seq1的下一个元素3再次传入lambda执行,依此类推,最终得出5! = 120。若希望基于阶乘结果进一步倍增,可启用可选参数init,例如:
>>> print reduce(lambda x, y: x * y, range(1, n),2) 240
此时,init将作为第一个元素,与seq1的第一个元素1一同传入lambda函数执行,返回结果再作为下一次迭代的第一个元素继续计算。
下面的示例更为直观,供参考:
reduce()接收的参数类型与map()类似,均包含一个函数f和一个列表,但行为不同。reduce()传入的函数f必须接收两个参数,并对列表中的每个元素反复调用函数f,最终返回累积结果值。
例如,定义一个函数f,接收x和y并返回它们的和:
def f(x, y): return x + y
当调用reduce(f, [1, 3, 5, 7, 9])时,reduce函数的计算过程如下:
首先计算前两个元素:f(1, 3),结果为4; 接着将结果与第3个元素计算:f(4, 5),结果为9; 再将结果与第4个元素计算:f(9, 7),结果为16; 最后将结果与第5个元素计算:f(16, 9),结果为25; 因列表无更多元素,计算结束,返回结果25。
上述计算过程实质上是对列表所有元素求和。尽管Python内置了sum()函数,但使用reduce()同样可以简便地实现求和功能。
reduce()还支持接收第3个可选参数,用于指定计算的初始值。若将初始值设为100,计算方式如下:
reduce(f, [1, 3, 5, 7, 9], 100)
此时结果将变为125,因为第一轮计算变为:
计算初始值与第一个元素:f(100, 1),结果为101。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









