高阶函数的定义:接收函数作为参数,或者将函数作为返回值的函数。函数式编程就是指这种高度抽象的编程范式。
高阶函数的抽象能力是非常强大的,合理的使用高阶函数,可以简化代码,提升可读性。
例如使用高阶函数求两个数的绝对值之和:
# f是第三个参数,用来接收将来传入的函数
def sum_num(a, b, f):
return f(a) + f(b)
result1 = sum_num(-5, 1, abs)
print(result1)
# 输出:6
常见的高阶函数有:filter()、map()、reduce()、sorted(),下面看一下它们的基本用法吧。
filter
filter( 函数名, 可迭代对象 )
作用:过渡序列中不符合条件的元素。
filter有两个参数,第1参数可以是函数,也可以是None.
当第1个参数是函数的时候,将第2个参数中每个元素进行计算。
当第1个参数是None时,直接将第二个参数中为True的值筛选出来。
返回的是内存地址,需要用list()转换。
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 得到列表中的偶数
def func(x):
return x % 2 == 0
result = filter(func, lst)
print(list(result))
# 输出:
[2, 4, 6, 8, 10]
使用匿名函数
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(list(filter(lambda x: x % 2 == 0, lst)))
map
map( 函数名,迭代对象 )
作用:对可迭代对象的每一个元素作为函数的参数进行运算,然后将其添加到一个新的对象中返回。
返回的是内存地址,需要用list()转换。
# 对可迭代对象进行2次方运算
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = map(lambda i: i ** 2, lst)
print(list(result))
#输出
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
reduce
reduce( 函数名(x,y) , 可迭代对象 )
作用:reduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
每次函数计算的结果继续和序列的下一个元素做累积计算。
要想使用,必需导入functools模块。
# 求列表元素之和
import functools
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def func(a, b):
return a + b
result = functools.reduce(func, lst)
print(result)
输出:
55
使用匿名函数
import functools
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(functools.reduce(lambda x, y: x + y, lst))
sorted()
sorted(iterable,key,reverse)
其中,iterable是可迭代对象。
key可选参数,可以接收函数来实现自定义的排序,默认为None(直接比较)。
reverse:排序规则,为一个布尔值,reverse = True 降序 , reverse = False 升序(默认)。
# 默认情况下,对字符串排序,是按照ASCII的大小比较的
lst = ['bb', 'aaaa', 'c', 'ddddddddd', 'fff']
print(sorted(lst))
输出:
['aaaa', 'bb', 'c', 'ddddddddd', 'fff']
#对列表按照int值排序
lst = [2, 5, '1', 3, '6', '4']
print(sorted(lst, key=int))
输出:
['1', 2, 3, '4', 5, '6']
“ 还记得sort()与sorted的区别吗
- sort() 函数只适用于列表排序,而sorted()函数适用于任意可以迭代的对象排序。
- sort() 函数排序会改变原有的待排序列表,而sorted()函数则不会改变。所以在使用列表进行排序时,需要考虑是否需要保存原列表,如果无需保存原列表,则优先使用sort() 节省内存空间,提高效率。
”