zoukankan      html  css  js  c++  java
  • 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")





  • 相关阅读:
    A Simple Problem with Integers poj 3468 多树状数组解决区间修改问题。
    Fliptile 开关问题 poj 3279
    Face The Right Way 一道不错的尺取法和标记法题目。 poj 3276
    Aggressive cows 二分不仅仅是查找
    Cable master(二分题 注意精度)
    B. Pasha and String
    Intervals poj 1201 差分约束系统
    UITextField的快速基本使用代码块
    将UIImage转换成圆形图片image
    color转成image对象
  • 原文地址:https://www.cnblogs.com/fangh/p/9024342.html
Copyright © 2011-2022 走看看