[转载] Python 中reduce()与lambda函数详解

参考链接: Python中的reduce

a = [2,22,222]

Sn = reduce(lambda x,y:x+y,a)

print "计算和为:",Sn

 

 

reduce() 函数会对参数序列中元素进行累积。 

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。 

其中reduce函数是python中的一个二元内建函数,它可以通过传给reduce中的函数(必须是二元函数)依次对数据集中的数据进行操作。例如上述代码传给reduce的函数是做加法,数据集是a,那么reduce函数的作用就是将数据集中的数据依次相加,最后打印出的结果就是246。 

函数语法:   

reduce(function, iterable[,initializer]) 

函数参数含义如下: 

1、function 需要带两个参数,1个是用于保存操作的结果,另一个是每次迭代的元素。

 

2、iterable 待迭代处理的集合

 

3、initializer 初始值,可以没有。 

reduce函数的运作过程是,当调用reduce方法时: 

1、如果存在initializer参数,会先从iterable中取出第一个元素值,然后initializer和元素值会传给function处理; 

接着再从iterable中取出第二个元素值,与function函数的返回值 再一起传给function处理,以此迭代处理完所有元素。最后一次处理的function返回值就是reduce函数的返回值。 

2、如果不存在initializer参数,会先从iterable中取出第一个元素值作为initializer值,然后以此从iterable取第二个元素及以后的元素进行处理。特殊情况下,如果集合只有一个元素,则无论function如何处理,reduce返回的都是第一个元素的值。 

看例子: 

reduce(lambda re,x:re+x,[2,4,6]) 

结果是12。 这里我们用的是lambda表达式(匿名函数),带两个参数,re就是指的是每次操作后的返回值,这里没带initializer参数,参数x就是代表集合中的元素。 

第一轮操作时,re的初始值为第一个元素为2,x为第二个元素4, 运算后re的结果是6. 

第二轮操作时,re的值就是上次的结果6,x的值为6,这样结果为12. 

因为只有三个元素,又没有initializer参数,所以只会执行两轮。 

  

 reduce(lambda re,x:re+x,[2,4,6],10) 

结果是22. 这个例子传入了初始化参数10 ,这样re的初始化值为10. 

有三个元素,需要操作三轮,结果就是22了 

 凡是要对一个集合进行操作的,并且要有一个统计结果的,能够用循环或者递归方式解决的问题,一般情况下都可以用reduce方式实现。在python 3.0.0.0以后, reduce已经不在built-in function里了, 要用它就得from functools import reduce。 

而其中的lambd表达式是一种精简函数的表达方法,省略了函数的定义,命名等问题。 

lambda表达式是起到一个函数速写的作用。允许在代码内嵌入一个函数的定义。 

如下函数,定义了一个lambda的表达式,求三个数的和: 

f = lambda x,y,z:x+y+x

print f(1,2,3)

 

>>>> 4

f = lambda x,y,z:x+y+z

print f(1,2,3)

>>>> 6 

用lambda表达式求n的阶乘: 

n = 5

print reduce(lambda x,y:x*y,range(1,n+1))

 

>>>> 120 

 lambda表达式也可以用在def函数中: 

def action(x):

    return lambda y:x+y

a = action(2)

print a(22)

 

>>>> 24 

 这里定义了一个action函数,返回了一个lambda表达式。其中lambda表达式获取到了上层def作用域的变量名x的值。 

a是action函数的返回值,a(22),即是调用了action返回的lambda表达式。 

这里也可以把def直接写成lambda形式。如下: 

b = lambda x:lambda y:x+y

a = b(2)

print a(22)#print (b(2))(22)

 

>>>> 24 

 以上是我在学习Python遇到对reduce和lambda不懂的时候,百度所得,如有错误,还请指正。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值