[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)

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

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

posted @ 2018-04-21 10:59  Chris-Zhang  阅读(1284)  评论(0编辑  收藏  举报