函数式编程:高阶函数

2021/10/09 python 共 1513 字,约 5 分钟

函数式编程:高阶函数

1. 函数式编程

函数式是python内建支持的一种封装,我们通过大段代码拆成函数,通过一层一层的函数调用,就可以把复杂的任务分解成简单的任务,这种分解可以称为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

函数式编程中,函数可以作为其他函数的输入值,也可以作为返回值,被修改或者分配给一个变量。

函数式编程长期以来在学术界流行,但几乎没有工业应用。造成这种局面的主因是函数式编程常被认为严重耗费CPU和存储器资源[18] ,这是由于在早期实现函数式编程语言时并没有考虑过效率问题,而且面向函数式编程特性,如保证参照透明性等,要求独特的数据结构和算法。[19] -from Wikipedia

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,同样的输入,可能得到不同的输出,因此,这种函数是有副作用的。 — from 廖雪峰

2. 高阶函数

高阶函数指的是用函数作为参数传输的函数。

先说明几个背景

1、变量名字可以指向函数(意思是函数可以赋值给变量)

# 比如绝对值abs函数,赋值给变量func
func = abs()
# func可以作为函数来给其他的变量作用
>>func(-5)
5

2、函数可以指向变量(意思是可以将变量赋值给函数名)

不推荐这样做,这样相当于把原来函数的作用给覆盖掉了,只有变量的值。

3、传入函数

因为变量可以指向函数,函数的参数可以接收变量。那么把函数作为参数传入到另外一个函数,那么被传入的函数就是高阶函数。

举个例子

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

>>add(-2, 4, abs)
6

2.1 map/reduce

2.1.1 map()

map(func, iterable_data)输入两个参数,第一个参数为函数,第二个参数为可迭代(Iterable)的数据。map的作用是将数据iterable_data,一个一个的作为参数输入到func里面。

比如,把这个list所有数字转为字符串:

>>> list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

2.1.2 reduce()

reduce(func, list)reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数func必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算。

比方说对一个序列求和,就可以用reduce实现:

>>> from functools import reduce
>>> def add(x, y):
...     return x + y
...
>>> reduce(add, [1, 3, 5, 7, 9])
25

2.2 filter

filtermap的作用一样,主要是将一个一个元素输入到函数里面,不同的是filter根据结果是true或者false来决定是否保留或丢弃。

所以在设计输入到filter的函数时,需要考虑返回值是bool

2.3 sorted

Python内置的sorted()函数就可以对list进行排序:

sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

文档信息

Search

    Table of Contents