[Python小知识] reduce函数的一个小坑

今天做python作业的时候,老师给出一段代码让我们判断能不能顺利执行(直接在IDLE上执行一下就知道了嘛),不能执行的话说明原因并修改

 

老师还贴心的给了个提示:根据Python 3.6.4的文档(documentation),我们发现functools模块中的reduce()函数还可以有第三个可选参数initializer,该参数将放在待处理的序列中的所有元素的前面,当序列为空时,这个参数的值可以作为缺省值。例如,

>>> reduce(lambda x, y: x + y, [], 6)

 

老师给的代码是这个样子的:

from functools import reduce
staff_workingweeks =({'name':'Adam Smith', 'week':17},
        {'name':'Dennis Roger', 'week':24},
        {'name':'Morgan Baker', 'week':7},
        {'name':'Alvin John', 'week':13})
def f_reduce(accumulator , value):
  total = accumulator['week'] + value['week'] 
       return total
total_week = reduce(f_reduce, staff_workingweeks)
print(total_week)

 

放在IDLE里执行一下试试,呵呵哒当然是报错啦

 

这个题本来是想要把这个列表里字典的week值累加起来,用reduce函数当然是最方便的啦,将f_reduce函数作为参数,f_reduce函数的两个参数应该是列表中的字典,但是有个bug,f_reduce的返回值是一个int类型的,而这个返回值通过reduce将会作为第一个参数传入f_reduce,而你在函数里是把它当成字典用的,系统当然会报错啦

 

解决方法是把total值改为accumulator+value[‘week’],因为在第一次调用f_reduce时,accumulator是字典类型,所以我们要给reduce的initializer添加一个值(老师给的小提示派上了用场),为了不影响结果,这个缺省值为0,代码和结果如下:

from functools import reduce

staff_workingweeks =[{'name':'Adam Smith', 'week':17},
        {'name':'Dennis Roger', 'week':24},
        {'name':'Morgan Baker', 'week':7},
        {'name':'Alvin John', 'week':13}]

def f_reduce(accumulator , value):
    total = accumulator + value['week'] 
    return total

total_week = reduce(f_reduce, staff_workingweeks,0)
print(total_week)

再运行一下试试,成功啦~

还是要好好理解函数的本质和调用啊。。。

转载于:https://www.cnblogs.com/jiaqizhang/p/8899737.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值