lambda语句块是函数的一种实现方式,称为匿名函数。在撸代码的时候,常常会想写一个函数,但是这个函数只会被调用一次,独立编写的这个函数就会十分污染环境了。lambda这个时候就发挥了作用,能够使代码更加简洁,某种程度上,一句话或者一行就实现的功能,可读性更高。
lambda经常配合内置函数map、filter和reduce出现,使用列表推广常常可以替代这些功能,且可读性更高,一般不要使用内置函数。
1、lambda语句构成
f=lambda x:x+1
f是匿名函数的名称,可以通过f来调用该函数,:左边是参数,可以有多个,右边是表达式或者返回值
表达式也可以很复杂
2、内置函数
(1)map
map是对列表进行映射,列表的元素个数不会发生改变,也可以使用列表推导来替代
map的定义为:map(func, *iterables),第一个参数为映射规则(表达式或函数),第二个参数是需要迭代运算的元组(列表,输入函数后不可变,因此使用元组)
这里是lambda方法和列表推导两种方法,对l1列表所有元素加1,列表推导更加容易理解,可读性更高
这里加入了条件判断,lambda语句中if语句必须增加else,而列表推导则没有这个要求。
该示例中,map的参数1给的是一个函数,将s的全部字符改为小写。这其实与lambda没有本质区别,因为lambda本质也是一个函数。
(2)filter
顾名思义有,filter就是按照某种规则,筛选数据
该内置函数的定义为:filter(function or None, iterable),与map的使用基本一样,下面给出几个样例
使用lambda筛选列表中大于2的数据,一样可以用列表推导来实现:
列表推导的可读性会更高。
(3)reduce
reduce是对输入列表的所有数据按照给定表达式进行迭代运算
reduce(function, sequence[, initial]) -> value
值得注意的是,使用reduce函数,需要从functools中导入,而map、filter则不需要。
(4)内置函数在Series、DataFrame中的引用
Series、DataFrame中使用map时只需要输入表达式,而不需要再输入列表,Series、DataFrame继承了map,下面给出一个较长的例子说明:
该案例中,d1和字典c1是已知的,d1原来有3个columns,现在要增加一个columns,也就是dd列,而dd列由集合c1根据d1的aa列的值作为键查询得到。计算时候,由于d1中有大写字母也有小写字母,因此先把字符串全部转化为小写,这个过程通过输入str.lower函数来实现。
当然,使用列表推导,一样可以实现该功能,只是可读性显示不是那么好:
在Series和DataFrame中没有找到reduce方法,这么简单介绍一下filter方法,主要是因为其like参数功能在某些场合使用起来十分方便(详细请查看Series.filter的DOC文档)。
如上,通过输入items列表可以选择指定columns的Series,构成一个新的DataFrame。
like参数允许只输入index或columns标签的部分值,axis指定在index或columns中进行查找,输出是所有满足条件的数据构成的新的DataFrame
map、reduce、filter的图片引用自:http://www.cnblogs.com/guigujun/p/6134828.html