• lambda表达式,filter,map,reduce,curry,打包与解包和



    当然是函数式那一套黑魔法啦,且听我细细道来。

    • lambda表达式

    也就是匿名函数。

    用法:lambda 参数列表 : 返回值

    例:

    +1函数

    f=lambda x:x+1

    max函数(条件语句的写法如下)

    f_max=lambda x,y:x if x>y else y

    上述定义的函数与用def定义的函数没有区别,而且左边的f=在某些情况下并不是必要的。

    • filter,map,reduce

    filter函数接受两个参数,第一个是过滤函数,第二个是可遍历的对象,用于选择出所有满足过滤条件的元素,不同版本的filter的返回值稍有区别,我用的是python3.5,filter返回的是经过过滤的可遍历对象。

    例:

    去除小写字母

    s=filter(lambda x:not str(x).islower(),"asdasfAsfBsdfC")for ch in s:print(ch)

    map函数接受的参数类型与filter类似,它用于把函数作用于可遍历对象的每一个元素。类似于数学中映射的概念。

    例:

    求y=2x+1(偷偷用了一下range函数生成定义域)

    s=map(lambda x:2*x+1,range(6))for x in s:print(x)

    reduce函数对每个元素作累计操作,它接受的第一个参数必须是有两个参数的函数。

    例:

    求和

    from functools import reduce
    s=reduce(lambda x,y:x+y,range(1,6))
    print(s)
    

    求乘积(第三个可选参数表示累计变量的初值)

    from functools import reduces=reduce(lambda x,y:x*y,range(1,6),1)print(s)
    • 柯里化(curry)函数

    如果一个函数需要2个参数,而你只传入一个参数,那么你就可以得到一个柯里化的函数,这是函数式编程语言的重要特性之一,遗憾的是,python并不能在语法层面支持柯里化调用,但它在库中提供了接口。

    例:

    *3函数

    f_mul=lambda x,y:x*yfrom functools import partialmul3=partial(f_mul,3)print(mul3(1))print(mul3(6))
    • 打包与解包

    有点类似于函数式中的模式匹配,略牵强。

    t=(1,2,3)x,y,z=t
    • 列表生成式

    这个也有点牵强,不知道严格意义上讲属不属于函数式风格。

    例:生成奇数序列

    l=[2*x+1 for x in range(10)]for i in l:print(i)

    最后来一个彩蛋(以前某答主提到的用调分函数来美颜的算法,忘了出处了,侵删)

    from PIL import Imagefrom math import sqrtim = Image.open("a.jpg")ret= im.convert(mode="RGB")ret = ret.point(lambda x:sqrt(x)*sqrt(255))ret.save("b.jpg")





  • 相关阅读:
    mybatis概述
    Spring的配置分别是xml和java style
    JavaScript对象数据过滤、修改
    Spring框架
    设计模式-工厂方法模式(Fatory Patterm)
    简单的数据结构
    java链式操作
    centos7 php开发环境安装-composer
    centos7 php开发环境安装-php
    centos7 php开发环境安装-Apache
  • 原文地址:https://www.cnblogs.com/fangh/p/9024342.html
Copyright © 2020-2023  润新知