Python 中的 reduce()

2024 年 8 月 29 日 | 5 分钟阅读

在 Python 中,reduce() 是一个内置函数,它将一个给定函数应用于可迭代对象的元素,将它们减少为单个值。

reduce() 的语法如下

  • function 参数是一个函数,它接受两个参数并返回一个单一的值。第一个参数是累积值,第二个参数是可迭代对象的当前值。
  • iterable 参数是要被归约的值的序列。
  • 可选的 initializer 参数用于为累积结果提供初始值。如果未指定 initializer,则可迭代对象的第一个元素将用作初始值。

这是一个演示如何使用 reduce() 查找列表中数字之和的示例

输出

Sum of the integers of num_list : 55
Sum of the integers of num_list with initial value 10 : 65

在此示例中,我们使用 reduce() 函数应用 add 函数,该函数将返回列表中每个元素对的总和,最终得到所有元素的总和。

让我们使用 lambda 函数作为 reduce() 函数的第一个参数

让我们来分析一下给定示例的 reduce() 函数是如何工作的

reduce() 函数接受两个参数:一个函数和一个可迭代对象。在本例中,我们使用 lambda 函数 lambda x, y: x * y 作为函数,并使用 numbers 列表作为可迭代对象。

  • lambda 函数接受变量 x 和 y,将它们相乘,并返回结果。当 lambda 函数首次运行时,变量 x 和 y 分别被设置为 my_list 的第一个和第二个元素(即 x = 1,y = 2)。lambda 函数将这两个数相乘并返回结果(1 * 2 = 2)。
  • 第二次调用 lambda 函数时,x 被设置为前一次调用的结果(x = 2),y 被设置为 numbers 列表的第三个元素(即 y = 3)。它将这两个值相乘并返回结果(2 * 3 = 6)。
  • lambda 函数会以这种方式为 my_list 中的每个元素重复调用,直到所有元素都被处理完毕。reduce() 函数返回列表中所有元素的乘积,然后将其赋给 product 变量,值为 120。此乘积计算如下:((((1 * 2) * 3)* 4)* 5) = 120。
  • 最后,我们使用 print() 函数打印 product 变量的值,输出为 120。

带 operator 函数的 reduce() 函数

通过使用 operator 函数而不是 lambda 函数,我们可以使代码更简洁、更易读。

这是一个演示使用 operator 函数作为 reduce 函数第一个参数的示例

输出

Sum of all elements in my_list1 : 15
Product of all elements in my_list1 : 120
Concatenated string by using operator.concat : ILoveJavatpoint
Concatenated string by using operator.add : ILoveJavatpoint

此代码展示了如何在 Python 中使用 reduce() 函数和 operator 函数对可迭代对象执行数学和字符串操作。

理解 reduce() 和 accumulate() 函数之间的区别

Python 的 functools 模块提供了 reduce() 和 accumulate() 函数,它们都以相似的方式操作可迭代对象。

  1. reduce() 和 accumulate() 函数的相似之处在于它们都接受两个参数:可迭代对象本身和一个描述要对其执行的操作的函数。然而,它们处理操作结果的方式是它们之间最主要的区别。
  2. reduce() 函数在对可迭代对象的前两个元素执行操作,然后将相同操作应用于结果和下一个元素。此过程一直重复,直到处理完可迭代对象的所有元素。操作的最终输出将作为单个结果返回。
  3. 虽然 accumulate() 函数也对可迭代对象的前两个元素执行操作,然后将相同操作应用于结果和后续元素,但 accumulate() 函数返回一个包含操作中间结果的迭代器。换句话说,在处理完每个元素后,accumulate() 函数会提供一系列代表操作结果的值。

一个理解 accumulate() 和 reduce() 之间区别的示例

在此示例中,我们有一个数字列表 [1, 2, 3, 4, 5]。我们使用 **reduce()** 计算所有数字的乘积,它返回单个值 120。

我们还使用 **accumulate()** 计算所有数字的乘积。但是,accumulate() 没有返回单个值,而是返回一个产生一系列中间结果的迭代器:[1, 2, 6, 24, 120]。

因此,**reduce()** 和 accumulate() 之间的主要区别在于 reduce() 返回一个表示操作最终输出的单个值。相比之下,accumulate() 返回一个产生中间结果序列的迭代器。