python的map、filter、reduce函数以及列表解析式

来源:互联网 发布:windows server个版本 编辑:程序博客网 时间:2024/06/03 11:16

lambda函数是python的匿名函数,匿名函数的意思是说它不需要函数名(因为某些函数太过简单,并不需要单独取个函数名)。

1、假如我们需要把数据加100。可以写一个函数:

def add(value):    return value + 100
>>print add(100)
>>200

也可以用匿名函数:

f = lambda x: x + 100
>>print f(100)
>>200
有必要专门写一个函数吗?没有必要,我们完全可以直接print 100 + 100,同样获得200。
但是如果是一个列表a = [1,2,3,4,5],我们现在要给列表里的元素都乘以100,也就是变成[100,200,300,400,500]。
可以写个for循环,给每个值乘以100。
a = [1,2,3,4,5]for i,v in enumerate(a):    a[i] = v * 100
>>print a
>>[100, 200, 300, 400, 500]
恩,这是一种方法。但是我们可以使用lambda+map使得语句更优雅
a = [1,2,3,4,5]print map(lambda x:x*100,a)
>>[100, 200, 300, 400, 500]
map:Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。

这样确实可以,但是利用列表推导式,我们可以写出更加易读的代码:
a = [1, 2, 3, 4, 5]print [val * 100 for val in a]
>>[100, 200, 300, 400, 500]


2、假如我们有一个列表b = [1,3,5,7,8],我们不需要里面的偶数,怎么办?
当然也可以写一个for循环,这里我就不写了。
也可以使用lambda+filter使得语句更优雅。

b = [1, 3, 5, 7, 8]print filter(lambda x: x % 2 != 0, b)
>>[1, 3, 5, 7]
filetr: Python内置的另一个有用的高阶函数,它接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
但是利用列表推导式,我们可以写出更加易读的代码:

b = [1, 3, 5, 7, 8]print [val for val in b if val % 2 != 0]
>>[1, 3, 5, 7]
3、假设我们有一个列表,c = [1,2,3,4,5],我们需要求和,怎么办?
可别写函数了,直接sum(c)就能得出结果了。
但是这里要介绍一下recude函数:

c = [1, 2, 3, 4, 5]print reduce(lambda x, y: x + y, c)
reduce:Python内置的一个高阶函数。它接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
跟斐波那契数列一样,对前两个元素操作之后,把结果跟第三个元素进行操作,依次类推。
reduce函数也可以满足下面的场景:

d = {'1': 'abc', '2': 'def'}print reduce(lambda first, second: [x + y for x in first for y in d[second]], '12', [''])
>>['ad', 'ae', 'af', 'bd', 'be', 'bf', 'cd', 'ce', 'cf']


总结:

1、列表表达式比内置的 map , filter,reduce 更加清晰,因为 map , filter ,reduce需要额外的 lambda 表达式的支持。
2、字典和集合也都支持列表表达式。





原创粉丝点击