Lambda 表达式
Lambda函数又称之为匿名函数,所谓匿名函数就是没有名字的函数。在我们日常的开发过程中,其实存在很多函数其实只是临时使用一次,或者这个函数的功能本身就非常的简单,例如就是做个加法或者交换下位置一类的,在这个时候,如果还是采用传统的方法去定义一个标准的函数,就显得多余了。
Lambda语法格式
语法格式:==lambda arguments: ==expression====
- lambda: 函数关键字
- arguments: 函数的参数列表,参数之间用,进行分割
- expression:返回的表达式,且表达式只能有一个。
举例:
实现一个最常见的x*x的函数。
>>> square = lambda x:x*x
>>> square
<function <lambda> at 0x0000000002705B38>
>>> y = square(2)
>>> y
4
从上面的例子可以看到第一个x 是代表的参数,后面的x*x是函数的内容。
应用举例
这里讨论的filter函数和下面讨论的map函数并非lambda函数的一部分,是完全独立的,属于python的内建函数,详情可以参考
lambda 与filter函数联动
==filter(function,iterable)==
iterable 是迭代器,指向需要可能要返回的数据;function是过滤的条件,其返回值是true or false。当filter函数返回为真时,迭代函数返回对应的值。
>>> test = [1,2,3,4,5]
>>> ret = list(filter(lambda x:(x>2),x+5))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name ‘x‘ is not defined
>>> ret = list(filter(lambda x:(x>2),test))
>>>
>>> ret
[3, 4, 5]
>>>
我们先看上面代码中运行正常的这部分:先看filter函数:function是一个lambda 函数 lambda x:(x>2) 意思是参数值必须要大于2。根据前面的解释,如果function为真,那么迭代函数就返回对应的指向值,所以得到的数据是3,4,5。
看了正确的部分,我们再来看错误的部分:第一个错误的部分是迭代函数写成了x+5,想表达的意思是参数值x+5,但实际上这里的x 是需要指的传入的值,而不是参数值,因此报的错误也是非常的明显:x没有定义。
与map函数联合
==map(function,iterable,...)== 首先map 函数主要用于映射关系,其与filter一样,后面是迭代器。其返回值是一个map对象,需要转变为列表或者元祖才能查看其中的内容。如:
>>> list(map(lambda x: x*2,range(5)))
[0, 2, 4, 6, 8]
>>> range(5)
[0, 1, 2, 3, 4]
从上面的例子可以看出,map函数主要是将iterable中的值作为参数逐个传给function,经过函数执行以后,返回一个list结果。但需要注意的是刚才我们看到的函数是可以有多个参数的,如果在多个函数下结果又是如何了,其实是一样的。如下:
>>> list(map(lambda x,y:x+y,range(1,5),range(5,9)))
[6, 8, 10, 12]
Reduce函数
Reduce函数很多时候是和map函数合并用的,MR模型的经典就不具体描述了。将上面的map函数修改一下:
>>> reduce(lambda x,y:x+y,range(1,5))
10
可以看到reduce的结果就是一个结果整数了,而不是像map那样是一个List。
实际上reduce的函数形式如下:reduce(function,sequence,starting_value)。对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用.
参考文档:
http://blog.csdn.net/liang19890820/article/details/72846966