来自《Python成为专业人士笔记》
reduce介绍
reduce函数用于迭代所有的元素并将结果按照既定方式累计,看如下例子:
#实现函数,计算列表所有元素的累计和
from functools import reduce
def add(s1, s2):
return s1 + s2
asequence = [1, 2, 3]
print(reduce(add, asequence)) #功能,将每个元素代入add函数实现累计
#输出 6 即: 1+2+3
当然,不使用自定义的add,直接使用operator模块的内置add也是可以的:
#实现函数,计算列表所有元素的累计和
from functools import reduce
import operator
asequence = [1, 2, 3]
print(reduce(operator.add, asequence))
#输出 6 即: 1+2+3
你甚至还可以指定一个累计起始值:
#实现函数,计算列表所有元素的累计和
from functools import reduce
import operator
asequence = [1, 2, 3]
print(from functools import reduce
import operator
asequence = [1, 2, 3]
print(reduce(add, asequence, 10)))
#输出 16 即: 10+1+2+3
再来个乘法累计例子,现在要演示它的计算过程:
from functools import reduce
def multiply(s1, s2):
print('{arg1} * {arg2} = {res}'.format(arg1=s1,arg2=s2,res=s1*s2))
return s1 * s2
asequence = [1, 2, 3]
cumprod = reduce(multiply, asequence, 5)
print(cumprod)
#输出:
5 * 1 = 5
5 * 2 = 10
10 * 3 = 30
30
记住,所谓累计即都是以之前的迭代作为后续迭代的基础值
当然,这里使用operator模块内置的算法能达到一样的效果:
reduce(operator.mul, [10, 5, -3])
作为开关器
reduce不会在迭代完成之前终止迭代,因此它可以用于创建类似any()或all()这样的开关器:
from functools import reduce
import operator
# "all"
reduce(operator.and_, [False, True, True, True]) # = False
# "any"
reduce(operator.or_, [True, False, False, False]) # = True