函数式编程(FunctionalProgramming)
基于lambda演算的一种编程方式
程序中只有函数
函数可以作为参数,同样可以作为返回值
纯函数式编程语言:LISP,Haskell
Python函数式编程只是借鉴函数式编程的一些特点,可以理解成一半函数式一半Python
内容:
高阶函数
返回函数
匿名函数
装饰器
偏函数
lambda表达式
函数:最大程度复用代码
存在问题:如果函数很短,则会造成繁琐
如果函数被调用次数少,则会造成浪费
对阅读者来说,造成阅读流程的被迫中断
lambda表达式(其他语言也叫匿名函数)
一个表达式,函数体相对简单,不是一个代码块,仅仅是一个表达式,所以没有return
参数可选,有无均可,也可有多个,参数用逗号隔开
参数用:冒号和之后的表达式主体隔开
举例如下:
高阶函数
把函数作为参数使用的函数,叫高阶函数
函数名称可以看做一个变量,变量可以当做参数,传入函数,所以函数名称也可以当做参数传入函数,举例如下:
系统定义的高阶函数:
map,原意是映射,即把集合或者列表里的的每一个元素,都按照一定规则进行操作,生产一个新的列表或者集合,返回的值是一个可迭代对象
reduce,原意是归并、缩减,把一个可迭代对象最后归并成一个结果,对于作为参数的函数有要求:必须有两个参数,必须有返回结果
使用reduce需要先导入functools包
reduce操作过程:reduce([1, 2, 3, 4, 5]) == f(f(f(f(1, 2), 3), 4), 5)
filter,过滤函数,对一组数据进行过滤,符合条件的数据会生成一个新的列表并返回
filter跟map比较:
相同:都对列表的每个元素逐一进行操作
不同:
map会生成一个跟原数据相对应的新队列
filter不一定,只有符合条件的才会进入新的数据集合
filter函数写法:
利用给定函数进行判断
返回值一定是布尔值
调用格式:filter(f,data),f是过滤函数,data是数据
高阶函数-排序:
把一个序列按照给定算法进行排序
key:在排序前针对每一个元素进行key函数运算,可以理解成按照key函数定义的逻辑进行排序
Python2和Python3相差甚大
返回函数:
函数可以返回具体的值,也可以返回一个函数作为一个结果
闭包closure
当一个函数在自己内部定义函数,并且内部的函数应用外部函数的参数或者局部变量,同时内部函数被当做返回值的时候,相关参数和变量保存在返回的函数中,这种结果叫做闭包,比如上面的myF4函数
装饰器decorator
在不改动函数代码的基础上无限扩展函数功能的一种机制,本质上讲,装饰器是一个返回函数的高阶函数
装饰器的使用:使用@语法,即在每次要扩展到函数定义前使用@+函数名
偏函数:
参数固定的函数,相当于一个有特定参数的函数体
首先引入functools.partial,作用是把一个函数某些参数固定,返回一个新函数