第三章:算法-functools:管理函数的工具-缩减数据集

本文探讨了Python中functools模块的reduce()函数如何用于处理数据序列,通过一个可调用对象将序列中的元素缩减成单个值。文章详细介绍了reduce()函数的基本用法,包括使用初始化参数和处理不同长度的输入序列。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值