Python reduce() 函数

Python reduce() 语法

reduce() 是 Python functools 模块的一个函数,它用于对一个可迭代对象进行遍历,然后会对每一个元素进行 “累加操作”,最终会返回一个值。

注意: reduce() 在 Python 2.x 中是一个内置对象,不过在 Python 3 中已经被移到 functools 这个内置模块中去了。所以如果想要使用 reduce() 函数,需要先导入 functools 模块。

语法:

from functools import reduce

reduce(function, iterable, initializer)

说明:

reduce() 函数接收以下 3 个参数。

  • function(必选):接收 2 个参数的函数,第 1 个参数为累积值,第 2 个参数为当前元素。
  • iterable(必选):它是一个可迭代对象。Python 内置的可迭代对象有列表、元组、字符串、字典、集合等。
  • initializer(可选):初始累积值。如果提供 initializer 参数,则它会作为第一个 prev 值。

参数 function 是一个函数,它需要有两个参数: prev 和 cur。其中 prev 表示 “初始值” 或 “上一次函数的返回值”,而 cur 表示当前元素,如下所示。

def fn(prev, cur):
    ……

reduce() 函数返回的是一个 “累积下来” 的值,而不是一个可迭代对象。

提示:

  • reduce() 是一个高阶函数。Python 内置的高阶函数只有 2 个:filter()map()。而 reduce() 属于 functools 模块。
  • 在许多情况下,我们可以使用更简洁的内置函数(如 sum()min()max())或 for 循环 来代替 reduce(),这些方式的代码可读性会更高。

Python reduce() 摘要

使用频率
时间复杂度 O(n)
官方文档 查看

Python reduce() 示例

接下来,我们通过几个简单的例子来讲解一下 Python reduce() 函数是如何使用的。

示例 1:reduce() 求和

from functools import reduce

# 定义函数
def fn(prev, cur):
    return prev + cur

# 定义可迭代对象
items = [3, 9, 1, 14, 50, 21]
result = reduce(fn, items)
print(result)

运行结果如下。

98

分析:

上面示例实现的是将 items 这个列表的所有元素进行求和。对于这个例子来说,如果使用 for-in 循环来实现,其代码如下。

items = [3, 9, 1, 14, 50, 21]
result = 0

for item in items:
    result += item

print(result)

最后需要清楚的是,reduce() 与 filter()、map() 这两个函数不一样。在性能方面,reduce() 相比 for 循环来说是没有优势的。甚至在实际测试中,reduce() 比 for 循环更慢。因此,如果对性能要求苛刻,建议使用 for 循环,如果希望代码更优雅而不在意耗时,可以用 reduce() 函数。

示例 2:reduce() 求最大值

from functools import reduce

# 定义函数
def fn(prev, cur):
    return prev if prev > cur else cur

# 定义可迭代对象
items = [3, 9, 1, 14, 50, 21]

# 调用 reduce()
result = reduce(fn, items)
print(result)

运行结果如下。

50

分析:

对于上面示例来说,下面两种方式是等价的。其中,方式 1 使用了条件表达式。

# 方式 1
def fn(prev, cur):
    return prev if prev > cur else cur

# 方式 2
def fn(prev, cur):
    if prev > cur:
        return prev
    else:
        return cur

reduce() 和 accumulate()

reduce() 和 accumulate() 都可以用于计算序列元素的总和,但是两者存在以下几个方面的区别。

  • reduce() 是 functools 模块的函数,而 accumulate() 是 itertools 模块的函数。
  • reduce() 只会返回一个值,也就是最终结果(即总和值)。accumulate() 返回一个可迭代对象,该对象包含所有中间累积结果。
  • reduce(function, iterable) 的第 1 个参数是函数,第 2 个参数是可迭代对象;而 accumulate(iterable, function) 的第 1 个参数是可迭代对象,第 2 个参数是函数。
reduce() vs accumulate()
reduce() accumulate()
所属模块 functools itertools
返回值 单一最终结果 中间结果迭代器
是否支持初始值
内存效率 O(1) O(n)
默认操作 无(必须提供函数) 加法

示例 3:reduce() 函数

from functools import reduce

def fn(prev, cur):
    return prev + cur

nums = [3, 9, 1, 14, 50, 21]
result = reduce(fn, nums)
print(result)

运行结果如下。

98

示例 4:accumulate() 函数

from itertools import accumulate

def fn(prev, cur):
    return prev + cur

nums = [3, 9, 1, 14, 50, 21]
result = accumulate(nums, fn)
print(result)
print(list(result))

运行结果如下。

<itertools.accumulate object at 0x0000021639FA3C90>
[3, 12, 13, 27, 77, 98]

分析:

accumulate() 函数返回一个可迭代对象,我们可以使用 list() 函数将其转化为列表,这样就可以直观看到结果了。

上一篇: filter()

下一篇: enumerate()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号