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() 函数返回的是一个 “累积下来” 的值,而不是一个可迭代对象。
提示:
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 curreduce() 和 accumulate()
reduce() 和 accumulate() 都可以用于计算序列元素的总和,但是两者存在以下几个方面的区别。
- reduce() 是 functools 模块的函数,而 accumulate() 是 itertools 模块的函数。
- reduce() 只会返回一个值,也就是最终结果(即总和值)。accumulate() 返回一个可迭代对象,该对象包含所有中间累积结果。
- reduce(function, iterable) 的第 1 个参数是函数,第 2 个参数是可迭代对象;而 accumulate(iterable, function) 的第 1 个参数是可迭代对象,第 2 个参数是函数。
| 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() 函数将其转化为列表,这样就可以直观看到结果了。
