函数式编程

2018-09-30  本文已影响0人  咸鱼有梦想呀

高阶函数

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

运行效果

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

list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
运行效果图

例如:一个序列求和

序列求和

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()求积:

运行结果

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


fliter应用

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

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

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

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,返回值就是该表达式的结果。

上一篇 下一篇

猜你喜欢

热点阅读