功能介绍
之前我们谈过OOP,而Functional Programming(FP)则是另一个崭新的领域,在OOP中我们以类为基础,以对象为根本,通过类的封装、继承来实现和现实世界的映射,通过对象的实例化,来实现方法的调用进而实现功能。但是FP则从某种意义上来说,抛弃了OOP,更极端一点来说,FP和OOP是水火不容的两方。
在FP的世界里,没有了类,没有了对象,有的只是函数Function,函数成了一等公民,任何事情都可以用函数来表示。函数式编程中我们常常提到一个关键的概念,就是纯函数,即输入固定,那么输出固定的函数,就称为纯函数。
但Python从本质来说,无意和FP挂钩,哪怕有一些FP的影子,毕竟连Python的作者都说了,从没想过实现FP之类的。
使用说明
Python的函数式编程,个人认为有一点天然的优势和Java相比,就是函数或者方法,可以脱离类存在,在Java中所有的方法必须在类中声明,不管是不是静态方法。
在一般的函数里,我们通常有函数名,有参数和返回值,参数的类型一般是基本类型或者类对象,但是如果说参数是函数呢?这就引出了一个概念,高阶函数。
高阶函数
所谓高阶函数,就是把函数当做参数,传递给函数
#基本的实例,函数作为参数传递给函数def calc(x,y,f): #该函数根据函数体推测,f是函数作为参数进行了传递return f(x)+f(y)def print_fun(a:str): #该函数实现了输入参数和字符串ss的拼接return a+'ss'print(calc('a','b',print_fun)) #assbss#当然了,也可以把函数赋值给变量s_fun = print_funprint(s_fun('c')) #css#常见的高阶函数map,reduce,filter##map函数def sequare(x):return x**2#map传递两个参数,第一个参数为函数f,第二个参数为序列,将序列中的每一个元素使用f进行处理,然后返回一个新的序列(python3中返回的实际是迭代器)print(list(map(sequare,[1,2,3]))) #[1, 4, 9]##reduce函数from functools import reduce #首先引入lst = [1, 2, 3, 4]#reduce函数接受两个参数,第一个参数为函数f,第二个参数为列表,然后将列表的第一个值和第二个值作为参数传递给函数f,将返回值作为第一个参数,列表的第三个值作为第二个参数,#继续传递给函数f,直到列表最后一个值#以下例子中使用的是匿名函数,该匿名函数和以下函数等价
def add(x,y): return x+y
print(reduce(lambda x, y: x + y, lst)) #10#filter函数price = [10.2,11.5,10.7,20]filter传递两个参数,第一个参数是函数f,第二个参数是列表,将列表的全部元素使用函数过滤,返回为True的所有元素,组成新的列表(实际在Python3中的filter的返回值是迭代器)进行返回print(list(filter(lambda x:x>15,price))) #[20]
练习题
- 使用filter函数并结合匿名函数将四大名著列表,实现名字不长于3位的名著的展示
- 使用map函数,将十二个月的列表名称都变为大写展示
