reduce()之js与python
最近在自学python基础,发现很多js中的内置函数python中都存在,甚至比js更加简洁,下面说一下reduce()在js和python中的用法,做个对比便于记忆。
reduce()简介:
reduce的原意为减少,缩小;在js中为数组的内置方法,在python中则是一个内置方法,可以对可迭代数据集合做处理。
js中的reduce:
reduce
为数组中的每一个元素依次执行callback
函数,不包括数组中被删除或从未被赋值的元素
语法:
因为js中reduce为数组的内置方法,所以使用时要与数组一起使用,即:
arr.reduce(function(accumulator
,currentValue,index,array){
...
}, initialValue);
参数说明:
第一个参数为回调函数function,包含四个参数:
accumulator
累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue
(见于下方)。
currentValue:
数组中正在处理的元素。
index:(可选)
数组中正在处理的当前元素的索引。 如果提供了initialValue
,则起始索引号为0,否则从索引1起始。
array:(可选)
调用reduce()
的数组
第二个参数为初始值:
initialValue(可选)
返回值:
函数累计处理的结果
注意:回调函数第一次执行时,accumulator
和currentValue
的取值有两种情况:
1)如果调用reduce()
时提供了initialValue
,accumulator
取值为initialValue
,currentValue
取数组中的第一个值;
2)如果没有提供 initialValue
,那么accumulator
取数组中的第一个值,currentValue
取数组中的第二个值。
如果数组为空且没有提供initialValue
,会抛出TypeError
。
如果数组仅有一个元素(无论位置如何)并且没有提供initialValue
, 或者有提供initialValue
但是数组为空,那么此唯一值将被返回并且callback
不会被执行。
举例:
[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array){ return accumulator + currentValue; });
callback 被调用四次,每次调用的参数和返回值如下表:
由reduce
返回的值将是最后一次回调返回值(10)。
更详细的讲解请参考:
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
python中的reduce():
描述:
reduce() 函数会对参数序列中元素进行累积。
函数将一个可迭代的数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
语法:
python中的reduce可处理的数据不仅仅局限于列表,所有可迭代数据均在处理范围之内
reduce(function, iterable[, initializer])
参数:
function:回调函数,有两个参数,与js的前两个参数相同
accumulator
累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue
(见于下方)。
currentValue:
数组中正在处理的元素。
iterable:
可迭代对象:类比与js中的arr
initializer:(可选)
初始参数:类比于js中的第二个参数
举例:
>>>def add(x, y) : # 两数相加 ... return x + y ... >>> reduce(add, [1,2,3,4,5]) # 计算列表和:1+2+3+4+5 15 >>> reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函数 15
reduce(add, [1,2,3,4,5]) ==> add( add( add( add(1, 2), 3), 4), 5)
以上是js和python的reduce函数整理,可以看出其实很像,区别在于使用形式不同,不得不承认的是python使用起来更加简单并且可处理的数据类型更加多,
如果js想用reduce想用来处理其他可迭代对象可能要使用到call,apply之类的方法才行了