Lambda 表达式
Lambda函数又称之为匿名函数,所谓匿名函数就是没有名字的函数。在我们日常的开发过程中,其实存在很多函数其实只是临时使用一次,或者这个函数的功能本身就非常的简单,例如就是做个加法或者交换下位置一类的,在这个时候,如果还是采用传统的方法去定义一个标准的函数,就显得多余了。
Lambda语法格式
语法格式:==lambda arguments: ==expression====
- lambda: 函数关键字
- arguments: 函数的参数列表,参数之间用,进行分割
- expression:返回的表达式,且表达式只能有一个。
举例:
实现一个最常见的x*x的函数。>>> square = lambda x:x*x>>> squareat 0x0000000002705B38>>>> y = square(2)>>> y4
从上面的例子可以看到第一个x 是代表的参数,后面的x*x是函数的内容。
应用举例
这里讨论的filter函数和下面讨论的map函数并非lambda函数的一部分,是完全独立的,属于python的内建函数,详情可以参考第11章的内容。这里把他们放在一起,主要是因为这几个函数经常一起出现使用而已。
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 "", line 1, in 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,还可以作为初始值调用.参考文档: