• Python笔记-高阶函数


    1、函数式编程

    函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量。

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

    传入函数

    既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

    一个最简单的高阶函数:

    def add(a,b,f):
        return f(a)+f(b)
        
    print(add(-1,-2,abs))

    当我们调用add(-5, 6, abs)时,参数xyf分别接收-56abs,根据函数定义,我们可以推导计算过程为:

    x = -5
    y = 6
    f = abs
    f(x) + f(y) ==> abs(-5) + abs(6) ==> 11
    return 11

    2、map/reduce

    def formate_name(x):
        s1=x[0].upper()
        s2=x[1:].lower()
        return s1+s2
    name=['andre','NataSha','JJKJK','XIIX']
    r=list(map(formate_name,name))
    print(r)

    map()传入的第一个参数是f,即函数对象本身。由于结果r是一个IteratorIterator是惰性序列,因此通过list()函数让它把整个序列都计算出来并返回一个list。

    再看reduce的用法。reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:

    reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

    如果要把序列[1, 3, 5, 7, 9]变换成整数13579reduce就可以派上用场:

    from functools import reduce
    def f(x,y):
        return x*10+y
    print(reduce(f,[1,3,5,7,9]))

     小练习:map()与reduce()函数结合使用

    from functools import reduce
    print('map()将传入的函数依次作用于序列的每一个元素'.center(70,'-'))
    print('在python3中map()函数返回的是iterator而不再是list,因此要做强制转换'.center(70,'-'))
    print('reduce()函数把上次计算的结果继续和下一个元素做类积效果并返回'.center(70,'-'))
    l=[-1,3,-5,7,-9]
    def fun_abs(x):
        return abs(x)
        
    def fun_add(x,y):
        return x*10+y
    print(reduce(fun_add,list(map(fun_abs,l))))

    小练习:利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。

    输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']

    def fun_transfer(x):
        s1=x[0].upper()
        s2=x[1:].lower()
        return s1+s2
    name=['adam', 'LISA', 'barT']
    print(list(map(fun_transfer,name)))

    3、filter()函数

    Python内建的filter()函数用于过滤序列。

    map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

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

    F:>python test.py
    [1, 3, 5, 7, 9]

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

     4、sorted()  

    排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。

    Python内置的sorted()函数就可以对list进行排序:

    >>> sorted([36, 5, -12, 9, -21])
    [-21, -12, 5, 9, 36]

    此外,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序

    >>> sorted([36, 5, -12, 9, -21], key=abs)
    [5, 9, -12, -21, 36]
    print(sorted(['bob', 'about', 'Zoo', 'Credit'],key=str.lower))

    sorted()也是一个高阶函数。用sorted()排序的关键在于实现一个映射函数。

    假设我们用一组tuple表示学生名字和成绩:

    L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
    
    请用sorted()对上述列表分别按名字排序,再按成绩从高到低排序
    L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
    def by_name(t):
        return t[0].lower()
    
    def by_score(t):
        return -t[1]
    print(sorted(L,key=by_name))
    print(sorted(L,key=by_score))
  • 相关阅读:
    linux 如何使用密钥登录 (CentOs)
    linux修改ssh端口 以及禁止root远程登录 (实验机 CentOs)
    查看Windows端口及端口关闭方法
    使用 Linux 终端 SSH 登录 VPS
    修改Chrome默认搜索引擎为Google.com
    Windows 小技巧: 變更輸入法順序
    CentOS 安装BitTorrent Sync详细步骤
    Android手机部分名词浅谈
    PPTP模式跟L2TP模式有什么不同
    .CO域名快被这帮搞IT的玩坏了……
  • 原文地址:https://www.cnblogs.com/liberate20/p/10693271.html
Copyright © 2020-2023  润新知