第 14 天:Python 高阶函数

简介: 第 14 天:Python 高阶函数

函数式编程现在逐渐被广大开发群体接受,越来越多的开发者们开始使用这种优雅的开发模式,而我们使用函数式编程最主要的是需要清楚:


  1. 什么是高阶函数(Higher-order Functions)?
  2. Python 中高阶函数有哪些?要怎么用?


高阶函数概念


在函数式编程中,我们可以将函数当作变量一样自由使用。一个函数接收另一个函数作为参数,这种函数称之为高阶函数。

举个例子:


def high_func(f, arr):    return [f(x) for x in arr]


上面的例子中, high_func 就是一个高阶函数。其中第一个参数 f 是一个函数,第二个参数 arr 是一个数组,返回的值是数组中的所有的值在经过 f 函数计算后得到的一个列表。例如:



from math import factorial
def high_func(f, arr):    return [f(x) for x in arr]
def square(n):    return n ** 2
# 使用python自带数学函数print(high_func(factorial, list(range(10))))# print out: [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
# 使用自定义函数print(high_func(square, list(range(10))))# print out: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


Python 常用高阶函数


如同java、scala等语言,我们很多常用的高阶函数基本都一致。在开发中我们经常使用的最基本的高阶函数其实就几个,而我们也可以基于这些函数去进行适当的扩展,那么下面开始介绍几种常用的高阶函数。


map


Make an iterator that computes the function using arguments from each of the iterables. Stops when the shortest iterable is exhausted.

根据提供的函数对指定序列做映射, 并返回映射后的序列,定义:


map(func, *iterables) --> map object
  • function # 序列中的每个元素需要执行的操作, 可以是匿名函数
  • *iterables # 一个或多个序列


正如前面所举的例子 high_func 函数, map 函数是 high_func 函数高阶版,可以传入一个函数和多个序列。



from math import factorial
def square(n):    return n ** 2
# 使用python自带数学函数facMap = map(factorial, list(range(10)))print(list(facMap))# print out: [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
# 使用自定义函数squareMap = map(square, list(range(10)))print(list(squareMap))# print out: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


可以看到输出了同样的结果,只是与 python2.X 不用的是, python3.X 中返回 map类 ,而前者直接返回一个列表。


我们使用匿名函数,也可以传入多个序列,如下


# 使用匿名函数lamMap = map(lambda x: x * 2, list(range(10)))print(list(lamMap))# print out: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 传入多个序列mutiMap = map(lambda x, y: x+y, list(range(10)), list(range(11, 15)))print(list(mutiMap))# print out: [11, 13, 15, 17]


reduce


Apply a function of two arguments cumulatively to the items of a sequence,from left to right, so as to reduce the sequence to a single value.

大致上来讲, reduce 函数需要传入一个有两个参数的函数,然后用这个函数从左至右顺序遍历序列并生成结果,定义如下:


reduce(function, sequence[, initial]) -> value
  • function # 函数, 序列中的每个元素需要执行的操作, 可以是匿名函数
  • sequence # 需要执行操作的序列
  • initial # 可选,初始参数


最后返回函数的计算结果, 和初始参数类型相同

简单举个例子:


# 注意,现在 reduce() 函数已经放入到functools包中。from functools import reduce
result = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
print(result)# print out 15

我们可以看到,序列 [1, 2, 3, 4, 5] 通过匿名函数进行了累加。

设定初始值:


# 设定初始参数:s = reduce(lambda x, y: x + y, ['1', '2', '3', '4', '5'], "数字 = ")
print(s)# print out:数字 = 12345


需要注意的是:序列数据类型需要和初始参数一致。


filter


Return an iterator yielding those items of iterable for which function(item) is true. If function is None, return the items that are true.

filter() 函数用来过滤序列中不符合条件的值,返回一个迭代器,该迭代器生成那些函数(项)为true的iterable项。如果函数为None,则返回为true的项。定义如下:


filter(function or None, iterable) --> filter object
  • function or None # 过滤操作执行的函数
  • iterable # 需要过滤的序列

举个例子:


def boy(n):    if n % 2 == 0:        return True    return False
# 自定义函数filterList = filter(boy, list(range(20)))
print(list(filterList))# print out: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 自定义函数filterList2 = filter(lambda n: n % 2 == 0, list(range(20)))
print(list(filterList2))# print out: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]


上面我们可以看到,列表中不能被 2 整除的数据都被排除了。


sorted


Return a new list containing all items from the iterable in ascending order.

A custom key function can be supplied to customize the sort order, and the reverse flag can be set to request the result in descending order.

sorted 函数默认将序列升序排列后返回一个新的 list,还可以自定义键函数来进行排序,也可以设置 reverse 参数确定是升序还是降序,如果 reverse = True 则为降序。函数定义如下


def sorted(iterable: Iterable[_T], *,           key: Optional[Callable[[_T], Any]] = ...,           reverse: bool = ...) -> List[_T]: ...
  • iterable # 序列
  • key # 可以用来计算的排序函数。
  • reverse # 排序规则,reverse = True降序,reverse = False 升序(默认)。

举个简单例子:


list01 = [5, -1, 3, 6, -7, 8, -11, 2]list02 = ['apple', 'pig', 'monkey', 'money']
print(sorted(list01))# print out: [-11, -7, -1, 2, 3, 5, 6, 8]
print(sorted(list01, key=abs))# print out: [-1, 2, 3, 5, 6, -7, 8, -11]
# 默认升序print(sorted(list02))# print out: ['apple', 'money', 'monkey', 'pig']
# 降序print(sorted(list02, reverse=True))# print out: ['pig', 'monkey', 'money', 'apple']
# 匿名函数排序print(sorted(list02, key=lambda x: len(x), reverse=True))# print out: ['monkey', 'apple', 'money', 'pig']


总结


以上我们简单的介绍了几个常用的高阶函数的使用,当然还有很多的高阶函数我们可以去研究,比如 zip 函数等,希望此节的介绍对大家有所帮助。


代码地址

python 高阶函数[1]

目录
相关文章
|
6月前
|
Python
函数式编程与装饰器:解释什么是高阶函数,并给出几个Python内置的高阶函数示例。编写一个Python装饰器,用于记录函数执行的时间。
函数式编程与装饰器:解释什么是高阶函数,并给出几个Python内置的高阶函数示例。编写一个Python装饰器,用于记录函数执行的时间。
50 2
|
5月前
|
Python
高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作
【6月更文挑战第20天】高阶函数如`map`, `filter`, `reduce`和`functools.partial`在Python中用于函数操作。装饰器如`@timer`接收或返回函数,用于扩展功能,如记录执行时间。`timer`装饰器通过包裹函数并计算执行间隙展示时间消耗,如`my_function(2)`执行耗时2秒。
34 3
|
1月前
|
Serverless Python
python高阶函数
【10月更文挑战第2天】
19 5
|
1月前
|
缓存 并行计算 算法
如何提高 Python 高阶函数的性能?
【10月更文挑战第2天】
14 3
WK
|
2月前
|
测试技术 Python
python中的高阶函数作用
Python中的高阶函数(HOFs)在编程中扮演着重要角色,通过将通用操作封装为可复用的函数,提升了代码的抽象能力和可维护性。它们是实现函数式编程的关键,支持映射、归约、过滤等模式,并简化了回调函数的使用。此外,高阶函数还用于实现装饰器,进一步增强了代码的功能,减少了冗余,提高了代码的可读性和可维护性。
WK
19 0
WK
|
2月前
|
Python
python中的高阶函数有哪些用途
在Python中,高阶函数(HOFs)接受或返回函数,增强了代码的灵活性与复用性。常见的高阶函数包括`map()`、`filter()`、`reduce()`及`sorted()`等,它们分别用于对序列应用函数、过滤元素、累积计算及排序。`reduce()`位于`functools`模块中,而`sorted()`则常与键函数配合使用。此外,`lambda`函数和装饰器也常与高阶函数结合使用,前者提供快速定义匿名函数的方式,后者则在不改变原函数的基础上添加新功能。高阶函数的应用远不限于这些特定函数,任何符合定义的函数都可视为高阶函数。
WK
21 0
|
3月前
|
分布式计算 Python
【python笔记】高阶函数map、filter、reduce
【python笔记】高阶函数map、filter、reduce
|
5月前
|
分布式计算 算法 Python
Python函数进阶:四大高阶函数、匿名函数、枚举、拉链与递归详解
Python函数进阶:四大高阶函数、匿名函数、枚举、拉链与递归详解
|
5月前
|
Python
在Python中,`map()`, `filter()` 和 `reduce()` 是函数式编程中的三个核心高阶函数。
【6月更文挑战第24天】Python的`map()`应用函数到序列元素,返回新序列;`filter()`筛选满足条件的元素,生成新序列;`reduce()`累计操作序列元素,返回单一结果。
38 3