美文网首页
函数式编程

函数式编程

作者: 咸鱼有梦想呀 | 来源:发表于2018-09-30 15:43 被阅读0次

    高阶函数

    • map()
      map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。

    例如,将一个函数f(x)=x2作用于一个list。就可以用map实现。

    运行效果

    map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把list所有数字转为字符串

    list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
    
    运行效果图
    • reduce()
      reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

    例如:一个序列求和

    序列求和

    python有内置的求和函数sum(),用reduce似乎多此一举

    sum()求和

    小练习:
    1.利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']:

    # -*- coding: utf-8 -*-
    def normalize(name):
       name=name[0].upper()+name[1:].lower()
       return name
    L1 = ['adam', 'LISA', 'barT']
    L2 = list(map(normalize, L1))
    print(L2)
    
    运行结果

    2.编写一个prod()函数,可以接受一个list并利用reduce()求积:

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

    例如:在一个list中只保留奇数:


    fliter应用

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

    练习:
    回数是指从左向右读和从右向左读都是一样的数,例如12321,909。利用filter()筛选出回数:

    def is_palindrome(n):
        nn = str(n) #转成字符串
        return nn == nn[::-1] #反转字符串并对比原字符串返回true/false
    
    运行结果
    • sorted()
      排序算法

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

    shorted排序

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

    sorted排序

    key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。

    字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。
    要想字符串排序忽略字母大小,就要加一个条件即可实现:

    排序

    如果要进行反向排序,只需要传入第三个参数reverse=True

    反向排序

    练习:
    假设用一组tuple表示学生名字和成绩:
    L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
    请用sorted()对上述列表分别按名字排序:

    def by_name(t):
        return t[0].lower()
    L=[('Dob',75),('Adam',92),('Bart',66),('Cisa',88)]  
    L1=sorted(L,key=by_name)
    print(L1)   
    
    运行结果

    再按成绩从高到低排序:

    def by_scort(t):
        return t[1]
    L=[('Bob',75),('Adam',92),('Bart',66),('Lisa',88)]
    L1=sorted(L,key=by_scort,reverse=True)
    print(L1) 
    
    运行结果

    返回函数

    函数作为返回值,就叫返回函数
    高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

    不需要立刻求和,而是在后面的代码中,根据需要再计算,可以不返回求和的结果,而是返回求和的函数:

    def lazy_sum(*args):
        def sum():
            ax = 0
            for n in args:
                ax = ax + n
            return ax
        return sum
    

    当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数

    返回函数说明

    在函数lazy_sum中又定义了函数sum,并且,内部函数sum可以引用外部函数lazy_sum的参数和局部变量,当lazy_sum返回函数sum时,相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”的程序结构拥有极大的威力。

    当我们调用lazy_sum()时,每次调用都会返回一个新的函数,即使传入相同的参数,f1()f2()的调用结果互不影响。

    匿名函数

    关键字lambda表示匿名函数

    例如:


    匿名函数

    匿名函数

    lambda x: x * x
    

    就是函数

    def f(x):
        x * x
    

    匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

    相关文章

      网友评论

          本文标题:函数式编程

          本文链接:https://www.haomeiwen.com/subject/zjceoftx.html