• 廖---函数式编程


    引入:
    越低级的语言,越贴近计算机,执行效率高;越高级的语言,越贴近计算,执行效率低。

    函数式编程的特点:允许函数本身作为参数传入另一个函数,还允许返回一个函数。

    高阶函数

    将函数作为参数传入,此函数称为 高阶函数。

    def add(x, y, f):        #参数f 为函数
        return f(x) + f(y)
    
    x=-5
    y=-6
    f = abs
    print(add(x,y,f))
    
    11
    

    map()/reduce()

    map(): 接收两个参数,一个是函数(可以有任意个参数),另一个是Iterable序列。map()将传入的函数依次作用于序列的每个元素,并将结果作为新的Iterator返回。

    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]
    
    

    结果r是一个Iterator,它是 惰性序列,因此通过 list()函数将其转为list,便于观察。

    map()作为高阶函数,将运算规则抽象了,可以用来计算复杂的函数,例:

    # 将list所有的数字转为字符串
    >>>list(map(str, [1,2,3,4,5,6,7,8,9]))
    ['1', '2', '3', '4', '5', '6', '7', '8', '9']
    

    reduce():接收两个参数,一个是函数(必须有两个参数),另一个是序列。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
    
    

    例:将字符串转为整型

    from functools import reduce
    
    def str2int(s):
        def fn(x,y):
            return x * 10 + y
        def char2num(s):
            return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9':9}[s]
        return reduce(fn, map(char2num, '123456'))
    

    filter

    和map()类似,filter() 也接收一个函数和一个Iterable序列,不同点是filter()将传入的函数依次作用每个元素,然后按返回值是True还是False决定保留还是丢弃此元素。
    例,在一个list中,删掉偶数,保留奇数:

    def is_odd(n):
        return n % 2 == 1
    list(filter(is_odd, [1,2,3,4,5,6,7]))
    [1,3,5,7]
    

    filter()返回的也是Iterator,即一个惰性序列,要强迫完成计算,需要用list()函数获得所有结果并返回list。

  • 相关阅读:
    elasticsearch中多个字段聚合及java实现
    elasticsearch中must和should组合查询
    Hash(哈希/散列)表中冲突处理及命中计算
    PHP代码审计理解(一)----Metinfo5.0变量覆盖
    SSL 3.0 POODLE攻击信息泄露漏洞_CVE-2014-3566
    菜鸡试飞----SRCの信息收集手册
    python3-邮件发送-不同格式
    windows下常用快捷指令记忆
    杂记
    偶然碰到的编码转换技巧--叮!
  • 原文地址:https://www.cnblogs.com/qev211/p/7502853.html
Copyright © 2020-2023  润新知