• 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的结构配合要经常使用,以后会派上用场的。

  • 相关阅读:
    如何写一个简单的解释器
    linux下ifconfig, DNS以及route配置
    再次看编码
    Linux kernel API的查看
    学习Haskell的一些资料
    Unix,windows和Mac中的换行
    Cmake中的find_package功能
    知乎上有一个问题“在mfc框架中,有上面方法能直接将opencv2.0库中的Mat格式图片传递到Picture Control”中显示?
    RANSAC和Flitline
    花40分钟写一个-CBIR引擎-代码公开
  • 原文地址:https://www.cnblogs.com/-chenxs/p/11202849.html
Copyright © 2020-2023  润新知