目录
- 1、定义
- 2、体验高阶函数
- 3、内置高阶函数
- 3.1 map()
- 3.2 reduce()
- 3.3 filter()
1、定义
把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现。 函数式编程就是指 这种高度抽象的编程范式。
2、体验高阶函数
体验之前,先看看两个函数:
# 在Python中, abs() 函数可以完成对数字求绝对值计算
print(abs(-19)) # 19
# round():浮点数的四舍五入
# round()注意(python3.5之后):如果距离两边一样远,会保留到偶数的一边;
# 比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。
print(round(1.2852, 1)) # 1.3
print(round(1.8)) # 2
print(round(2.675, 2)) # 2.67
# 论我们从python2还是3来看,结果都应该是2.68的,
# 结果它偏偏是2.67,为什么?这跟浮点数的精度有关。我们知道在机器中浮点数不一定能精确表达,
# 因为换算成一串1和0后可能是无限位数的,机器已经做出了截断处理。
# 那么在机器中保存的2.675这个数字就比实际数字要小那么一点点。
# 这一点点就导致了它离2.67要更近一点点,所以保留两位小数时就近似到了2.67。
下面的例子要用到这两个函数,所有先说了一下,总之,round函数慎用。
例子:
# 需求:⼀一个函数完成计算任意两个数字的绝对值之和。
# 方法一:
def add_num1(a, b):
return abs(a) + abs(b)
result1 = add_num1(-1, 2)
print(result1) # 3
# 2.方法二:
def add_num2(a, b, f): # f是第三个参数,用来接收将来传入的函数
return f(a) + f(b)
result2 = add_num2(-1, 2, abs) # 求绝对值
print(result2) # 3
result3 = add_num2(2.2, 3.9, round) # 四舍五入
print(result3) # 6
注意:
两种方法对比之后,发现,⽅法2的代码会更加简洁。
函数式编程大量使用函数,减少了了代码的重复,因此程序比较短,开发速度较快。
3、内置高阶函数
3.1 map()
map(func, lst)
,将传入的函数变量func作用到lst变量量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。
例子:
# 语法;map(func, lst)
list1 = [1, 2, 3, 4, 5]
def fun(x): # 计算一个数的平方
return x**2
result = map(fun, list1) # 将fun作用到list1中的每个元素,返回一个迭代器
print(result) # 结果:<map object at 0x0000016F3764D390>
print(list(result)) # 转换成列表,结果:[1, 4, 9, 16, 25]
这里map()函数还有一个很好的用法:
算法比赛中常见到,请在同一行输入n, m,这个map()函数就很好用,如下:
# 1. split()函数默认空格分割,2. 用split()函数分割之后就成单独的数了
n, m = map(int, input().split())
print(n, m)
3.2 reduce()
reduce(func(x,y),lst)
,其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累计计算。
注意:reduce()传入的参数func必须接受2个参数。
例子:
需求:计算list1 序列中各个数字的累加和。
# 需求:计算list1 序列中各个数字的累加和。
import functools
list1 = [1, 2, 3, 4, 5]
result = functools.reduce(lambda a, b : a + b, list1) # 作用就是简化代码
print(result) #15
3.3 filter()
filter(func, lst)
函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象。如果要转换为列表,可以使用 list() 来转换。
例子:
需求:过滤掉序列中的偶数
# 需求:过滤掉序列中的偶数
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = filter(lambda x: x%2 != 0, list1) # 符合条件的保留
print(result)
print(list(result)) # [1, 3, 5, 7, 9]