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")





  • 相关阅读:
    Path,Files巩固,题目:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
    JavaSE复习_11 IO流复习
    JavaSE复习_10 多线程复习
    采用多线程和生产者消费者模式来实现对于一个目录以及所有子目录下的文件内容的搜索,打印出包含指定关键字的行.
    多线程_多生产者多消费者的实现问题
    算法_栈与队列的Java链表实现
    算法_队列的Java通用数组实现
    vuex之单向数据流
    原生JS实现瀑布流布局
    addEventListener调用带参数函数
  • 原文地址:https://www.cnblogs.com/fangh/p/9024342.html
Copyright © 2011-2022 走看看