今天刷题时又见识到了大佬精简的代码,所以特地学习了一下reduce的用法,在此记录。
reduce的语法格式
reduce(function, sequence[, initial]) -> value
reduce函数接受一个function和一串sequence,并返回单一的值,以如下方式计算:
1.初始,function被调用,并传入sequence的前两个items,计算得到result并返回
2.function继续被调用,并传入上一步中的result,和sequence种下一个item,计算得到result并返回。一直重复这个操作,直到sequence都被遍历完,返回最终结果。
注意1. 当initial值被指定时,传入step1中的两个参数分别是initial值和sequence的第一个items。reduce()最多只能接受三个参数,func,sequence,initial。
注意2. 在python2中reduce时内置函数,但是在python3中,它被移到functools模块,因此使用之前需要导入,如
>>> from functools import reduce
>>>a=[1, 2, 2, 1, 3, 3, 4, 1]
>>> reduce(lambda x,y:x+y ,a) #实现加法功能
17
>>>reduce(lambda x,y:x+y ,a,2)#指定initial值
19
那么如果一开始sequence只有一个元素,并且没有设定initial,会不会报错呢?
>>> reduce(lambda x,y:x+y ,[2])
2
>>> reduce(lambda x,y:x*y ,[2])
2
'''
可以发现并没有报错,但也不能判断是传入了具体什么值
第一个例子中好像传入的是0,但第二个例子又好像是1
'''
所以只需要记住只有一个参数的时候reduce()函数会返回它本身
总结
我们可能会发现这些功能,都可以用for loop来替代,但是reduce()使代码看起来更精简,而且运行性能更好,更准确。