今天做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)
再运行一下试试,成功啦~
还是要好好理解函数的本质和调用啊。。。