Python中的lambda和filter,reduce,map

Python 里有些个特别的技巧,这些技巧很难说是为了应对某些特别的场景,或者说是为了特别的需求而作。但也并不是说这些技巧毫无用处,在某些角度上看了还是很有用的,比如使用lambda可以写出匿名函数,减少代码量,有个比较正规的名词叫做 throw-away 函数,在我理解就是用完即扔,还真有点阅后即焚的味道。

准备陆续记录下来到博客,这次就暂时写几个大家都知道的,比较有热度的,内建的几个技巧或者说是机制,或者说是函数,均可。

lambda 函数

lambda函数是个机制,可以让程序员写出一行代码的函数。或者说将一行代码的函数,都使用lambda这个机制,以减少代码量。

首先介绍lambda函数的定义和调用语法:形如

lambda argument_list: expression

关键字 lambda 跟参数列表,可以是多个, 接着 :(冒号), 之后就是表达式

可以将上面的整行赋值给某个变量,变量就类似函数名,如果要调用改函数,可以直接用变量调用,下面是例子

func = lambda x: x+2
func(1)

以上func就是lambda 函数, x为函数参数, x+2 为函数表达式, 之后func(1) 把1 作为参数传给lambda函数,输出 3

lambda函数也可以是匿名的, 修改以上代码如:

print (lambda x: x+2)(1)

以上代码也输出 3

需要说明的是,lambda函数是一种机制,更是一种风格,因此并不强制必须要用lambda函数。这让本博想起类C风格的 if 表达式中花括号问题,if 表达式分支中如果只有一行,那么花括号是可以省略的,但是某些人的代码习惯,或者某些公司的代码习惯规定,不论 if 表达式中的分支一行也好,多行也好,必须加上花括号,以免编译出错或者阅读不便,最主要的是避免不必要的bug。 那么,想来,有时候便利或者程序的准确性,都是需要衡量的,最主要的是,对基础的掌握和理解。

filter 函数

filter函数,看名字是过滤,形式如下:

filter(function, iterable)

iterable 可以是任何可遍历的list, 如果是字典,过滤的是key(已亲测,Python 2.7)。 function是针对每个list元素所作的操作函数,主要是条件操作,元素是否大于某个值,或者取余数,取模之类的,将符合条件的元素append到返回的list中, 因此,整个filter函数返回一个list,其中每个元素符合function所作的逻辑判断

举个栗子:

l = [1,2,4,6,2,34,6576,56]
r = filter(lambda x : x > 30, l)
print l
print r

输出

[1, 2, 4, 6, 2, 34, 6576, 56]
[34, 6576, 56]

r为filter之后的返回值,数组类型,把大于30的元素重新组织成一个list,即所谓的条件过滤。

map 函数

map函数于filter很类似,参数都一样,也是function和一个可遍历的序列,返回值也是个list,如下:

map(function, iterable, ...)

唯一不同的是,function的函数体是个计算过程,将参数中每个list的元素都进行计算,返回一个list

另外,iterable可以是多个list,重点是 长度 必须一样,例如,有几个list参数,lambda里面就可以有几个参数,分别对应多个list的同一个位置的元素值,这样可以进行多个list间计算。

举个栗子:

l = [1,2,3,4,5,6]
l2 = [7,8,9,10,11,12]
r = map(lambda x, y : x + y + 1, l, l2)
print l
print l2
print r

输出

[1, 2, 3, 4, 5, 6]
[7, 8, 9, 10, 11, 12]
[9, 11, 13, 15, 17, 19]

reduce 函数

reduce 函数更关注list本身,返回操作后的一个值,形式如下:

reduce(function, iterable[, initializer])

function 和 iterable 同上, initializer 是初始值,这个跟reduce的作用有关系,reduce的作用是:

如果 initializer 为 None, 那么, function的第一个参数即是 list 第一个元素,第二个参数即是 list 的第二个参数

如果 initializer 不为 None,那么,function的第一个参数即为 initializer , 第二个参数为list的第一个元素

之后,就将list循环操作,参数值为list的元素+1位,直至循环结束。 因此, 其中function需要2个参数。

举个栗子:

l = [1,2,3,4,5,6]
r = reduce(lambda x, y : x + y, l, 1)
print l
print r

输出:

[1, 2, 3, 4, 5, 6]
22

再举个栗子:

l = [1,2,3,4,5,6]
r = reduce(lambda x, y : x if x > y else y, l, 1)
print l
print r

输出:

[1, 2, 3, 4, 5, 6]
6

以上操作是取列表最大值。