map/reduce+lambda让程序简单化

map()函数

map()函数接收两个参数,一个是函数,一个是Iterablemap将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

也就是  map(f,[x,x,x,x])  那么f是一个函数,[x,x,x,x]是一个序列,那么map完成的操作是将序列里面的每一个元素x传入到函数f中去执行,将每个元素执行的结果返回为新的序列  Iterator(惰性序列)

由于Iterator是惰性序列,因此如果要将结果以序列方式显示出来,那么一般在前面加 list 以列表的形式显示出来。

举例说明,比如我们有一个函数f(x)=x^2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现如下:

def f(x):
    return x*x
r=map(f,[1,2,3,4,5,6,7,8,9])
list(r)
运行结果:[1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce函数

reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

效果为:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

例如:把序列[1, 3, 5, 7, 9]变换成整数13579

from functools import reduce
def fn(x, y):
     return x * 10 + y

reduce(fn, [1, 3, 5, 7, 9])

运行结果:13579

lambda函数

lambda可一行实现定义一个函数

lambda 自变量:完成的功能表达式

例如 lambda x,y:x+y  及定义了一个两参数求和的函数

map/reduce+lambda的简化

最开始的利用map函数对一个列表的元素求平方的代码就可以改成:

list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9]))

结果相同,简化了代码

后面利用reduce将序列[1,3,5,7,9]变成整数13579的代码可以简化为:

from functools import reduce
reduce(lambda x,y:x*10+y,[1,3,5,7,9])

自身觉得map+lambda的结构配合要经常使用,以后会派上用场的。

猜你喜欢

转载自www.cnblogs.com/-chenxs/p/11202849.html