3.1.4 缩减数据集
reduce()函数取一个callable和一个数据序列作为输入。它会用这个序列中的值调用这个callable,并累加得到的输出来生成单个值作为输出。
import functools
def do_reduce(a,b):
print('do_reduce({},{})'.format(a,b))
return a + b
data = range(1,5)
print(data)
result = functools.reduce(do_reduce,data)
print('result:{}'.format(result))
这个例子会累加输入序列中的数。
运行结果:
range(1, 5)
do_reduce(1,2)
do_reduce(3,3)
do_reduce(6,4)
result:10
可选的initializer参数放在序列最前面,像其他元素一样处理。可以利用这个参数以新输入更新前面计算的值。
import functools
def do_reduce(a,b):
print('do_reduce({},{})'.format(a,b))
return a + b
data = range(1,5)
print(data)
result = functools.reduce(do_reduce,data,99)
print('result:{}'.format(result))
在这个例子中,使用前面的总和99来初始化reduce()计算的值。
运行结果:
range(1, 5)
do_reduce(99,1)
do_reduce(100,2)
do_reduce(102,3)
do_reduce(105,4)
result:109
如果没有initializer参数,那么只有一个元素的序列会自动缩减为这个值。空列表会生成一个错误,除非提供了一个initializer参数。
import functools
def do_reduce(a,b):
print('do_reduce({},{})'.format(a,b))
return a + b
print('Single item in sequence:',functools.reduce(do_reduce,[1]))
print('Single item in sequence with initializer:',
functools.reduce(do_reduce,[1],99))
print('Empty sequence with initializer:',functools.reduce(do_reduce,[],99))
try:
print('Empty sequence:',functools.reduce(do_reduce,[]))
except TypeError as err:
print('ERROR:{}'.format(err))
由于initializer参数相当于一个默认值,但也要与新值结合(如果输入序列不为空),所以必须仔细考虑这个参数的使用是否适当,这很重要。如果默认值与新值结合没有意义,那么最好是捕获TypeError而不是传入一个initializer参数。
Single item in sequence: 1
do_reduce(99,1)
Single item in sequence with initializer: 100
Empty sequence with initializer: 99
ERROR:reduce() of empty sequence with no initial value