函数式编程
1、简介
- Functional Programming。
- 允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
2、高阶函数
2.1、变量可以指向函数
- abs(-10)是函数调用,abs是函数本身。
- 函数本身可以赋值给变量,即:变量可以指向函数。
- f = abs f(-10) --> 10
2.2、函数名也是变量
- 对于abs()这个函数,完全可以把abs看成是一个变量,指向一个可以计算绝对值的函数。eg:abs = 10之后abs(-10)会报错,因为abs指向了10就无法调用函数了。
2.3、传入函数
- 一个函数就可以接受另一个函数作为参数,这种函数就成为高阶函数。
3、map/reduce
3.1、map
- map函数接收两个参数,一个是函数,一个是Iterator。
- r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]),其中f为函数,返回的r是一个Iterator(map)。通过list()函数调用时才会计算得出每个元素。list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])):将所有元素变为字符串。
3.2、reduce
- reduce把一个函数作用在一个序列上,这个函数必须接受两个参数,reduce把结果继续和序列的下一个元素做累积计算,效果为
reduce(f, [x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
3.3、filter
- filter()用于过滤序列,把传入的参数依次作用于每个元素,根据返回值是True还是False决定是否保留钙元素。filter(f, L),其中f为过滤条件函数。
- filter()返回的是一个Iterator。
3.4、sorted
- 是一个高阶函数,可以接受一个key函数来实现自定义的排序。sorted([1,3,2,8,5], key=abs),会根据绝对值大小来排序。key指定的函数将会作用于list上每一个元素。
- 默认情况下对字符串的排序,是按照ASCII大小进行比较的。可以根据reverse参数进行是否反向。
3.5、返回函数
-
可以将函数作为结果值返回。
-
可以在函数中添加函数,当调用外部函数时返回内部函数,调用内部函数后才真正的执行逻辑。
-
闭包:返回的函数没有立即执行,而是调用到了f()才执行。
-
返回闭包时返回函数不要引用任何循环变量,或者后续会发生变化的变量。
3.6、匿名函数
- 关键字lambda表示匿名函数。写作lambda 参数:逻辑描述。
- python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数。
3.7、装饰器
- 通过变量指向函数,可以根据函数对象的_name_属性,获得函数的名字,如f.name。
- 想要增强now()函数的功能,如在函数前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运行期间动态增加功能的方式,称之为装饰器。