功能介绍

之前我们谈过OOP,而Functional Programming(FP)则是另一个崭新的领域,在OOP中我们以类为基础,以对象为根本,通过类的封装、继承来实现和现实世界的映射,通过对象的实例化,来实现方法的调用进而实现功能。但是FP则从某种意义上来说,抛弃了OOP,更极端一点来说,FP和OOP是水火不容的两方。
在FP的世界里,没有了类,没有了对象,有的只是函数Function,函数成了一等公民,任何事情都可以用函数来表示。函数式编程中我们常常提到一个关键的概念,就是纯函数,即输入固定,那么输出固定的函数,就称为纯函数。
但Python从本质来说,无意和FP挂钩,哪怕有一些FP的影子,毕竟连Python的作者都说了,从没想过实现FP之类的。

使用说明

Python的函数式编程,个人认为有一点天然的优势和Java相比,就是函数或者方法,可以脱离类存在,在Java中所有的方法必须在类中声明,不管是不是静态方法。
在一般的函数里,我们通常有函数名,有参数和返回值,参数的类型一般是基本类型或者类对象,但是如果说参数是函数呢?这就引出了一个概念,高阶函数。

高阶函数

所谓高阶函数,就是把函数当做参数,传递给函数

  1. #基本的实例,函数作为参数传递给函数
  2. def calc(x,y,f): #该函数根据函数体推测,f是函数作为参数进行了传递
  3. return f(x)+f(y)
  4. def print_fun(a:str): #该函数实现了输入参数和字符串ss的拼接
  5. return a+'ss'
  6. print(calc('a','b',print_fun)) #assbss
  7. #当然了,也可以把函数赋值给变量
  8. s_fun = print_fun
  9. print(s_fun('c')) #css
  10. #常见的高阶函数map,reduce,filter
  11. ##map函数
  12. def sequare(x):
  13. return x**2
  14. #map传递两个参数,第一个参数为函数f,第二个参数为序列,将序列中的每一个元素使用f进行处理,然后返回一个新的序列(python3中返回的实际是迭代器)
  15. print(list(map(sequare,[1,2,3]))) #[1, 4, 9]
  16. ##reduce函数
  17. from functools import reduce #首先引入
  18. lst = [1, 2, 3, 4]
  19. #reduce函数接受两个参数,第一个参数为函数f,第二个参数为列表,然后将列表的第一个值和第二个值作为参数传递给函数f,将返回值作为第一个参数,列表的第三个值作为第二个参数,
  20. #继续传递给函数f,直到列表最后一个值
  21. #以下例子中使用的是匿名函数,该匿名函数和以下函数等价

def add(x,y): return x+y

  1. print(reduce(lambda x, y: x + y, lst)) #10
  2. #filter函数
  3. price = [10.2,11.5,10.7,20]
  4. filter传递两个参数,第一个参数是函数f,第二个参数是列表,将列表的全部元素使用函数过滤,返回为True的所有元素,组成新的列表(实际在Python3中的filter的返回值是迭代器)进行返回
  5. print(list(filter(lambda x:x>15,price))) #[20]

练习题

  • 使用filter函数并结合匿名函数将四大名著列表,实现名字不长于3位的名著的展示
  • 使用map函数,将十二个月的列表名称都变为大写展示