Python常用高阶函数全面解析:通俗易懂的指南

Python常用高阶函数全面解析:通俗易懂的指南

一、什么是高阶函数?

高阶函数(Higher-order Function)是指能够接受其他函数作为参数,或者将函数作为返回值的函数。在Python中,函数是一等公民,可以像普通变量一样传递和使用。

简单理解:高阶函数就是把函数当玩具的函数——可以接收函数、可以返回函数、可以把函数传来传去。

二、Python五大常用高阶函数

Python中最常用的高阶函数有五个,它们都来自functools模块或内置函数:

高阶函数作用返回值常用场景
map()对序列中每个元素应用函数迭代器数据转换
filter()过滤序列中符合条件的元素迭代器数据筛选
reduce()累积计算序列元素单个结果聚合计算
sorted()排序序列新列表数据排序
装饰器修改或增强函数功能包装后的函数功能扩展

下面我们逐个详细讲解。

1. map()函数:批量处理器

作用:

对可迭代对象的每个元素应用指定函数,返回一个包含所有结果的新迭代器(Python 3 中返回 map 对象,需转为列表显示)。

语法:
map(function, iterable, ...)
  • function:处理函数(可以是内置函数、lambda 或自定义函数)
  • iterable:可迭代对象(如列表、元组)
示例:
① 对列表元素平方
nums = [1, 2, 3, 4]
squared = map(lambda x: x**2, nums)
print(list(squared))  # 输出: [1, 4, 9, 16]
② 多参数函数处理
def add(a, b):return a + blist1 = [1, 2, 3]
list2 = [4, 5, 6]
result = map(add, list1, list2)
print(list(result))  # 输出: [5, 7, 9]
特点:
  • 不修改原数据,生成新结果
  • 可同时处理多个可迭代对象(要求函数能接收对应数量的参数)
  • 适合统一转换场景(如类型转换、数学运算)
map()工作原理:
原始序列: [1, 2, 3, 4]↓ map(函数)
新序列: [函数(1), 函数(2), 函数(3), 函数(4)]

2. filter()函数:数据过滤器

作用:

筛选可迭代对象中满足条件的元素,返回一个包含所有符合条件元素的新迭代器(Python 3 中返回 filter 对象)。

语法:
filter(function, iterable)
  • function:判断函数(返回 True/False,若为 None 则直接过滤掉“假值”)
  • iterable:可迭代对象
示例:
① 筛选偶数
nums = [1, 2, 3, 4, 5]
evens = filter(lambda x: x % 2 == 0, nums)
print(list(evens))  # 输出: [2, 4]
② 过滤空字符串
words = ["hello", "", "world", None, " "]
valid = filter(None, words)  # 过滤掉 bool(value) 为 False 的元素
print(list(valid))  # 输出: ['hello', 'world', ' ']
特点:
  • 保留原元素,只做筛选
  • 适合条件过滤场景(如数据清洗、有效性检查)

filter()工作原理:
原始序列: [1, 2, 3, 4, 5, 6]↓ filter(条件函数)
新序列: [2, 4, 6]  # 只保留使函数返回True的元素

3. reduce()函数:累积计算器

作用:

对可迭代对象中的元素进行累积计算,通过指定的二元函数从左到右依次处理元素,最终返回一个单一的累积结果

语法:
from functools import reduce  # Python 3 需从模块导入reduce(function, iterable[, initializer])
  • function:二元函数(接收两个参数,返回一个结果)。
  • iterable:可迭代对象(如列表、元组)。
  • initializer(可选):初始值,若提供则作为第一个计算的左参数。
核心逻辑:
  1. 从可迭代对象中依次取出两个元素,传递给 function 计算。
  2. 将计算结果与下一个元素继续传递给 function,直到所有元素处理完毕。
  3. 返回最终结果。
示例:
① 计算列表元素的乘积
from functools import reducenums = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, nums)
print(product)  # 输出: 24 (1 * 2 * 3 * 4)
② 拼接字符串(带初始值)
words = ["Hello", "World", "!"]
sentence = reduce(lambda x, y: f"{x} {y}", words, "Say:")
print(sentence)  # 输出: "Say: Hello World !"
③ 模拟 sum() 功能
nums = [10, 20, 30]
total = reduce(lambda x, y: x + y, nums)
print(total)  # 输出: 60
特点:
  • 必须导入 functools(Python 3 中不再是内置函数)。
  • 适合需要逐步累积的场景(如累加、累乘、最大值/最小值)。
  • 可指定初始值(避免空列表报错)。
reduce()工作原理:
初始值(可选) + 序列: [a, b, c, d]↓ reduce(函数)
计算过程: 函数(函数(函数(a, b), c), d)

4. sorted()函数:智能排序器

作用:

对可迭代对象进行排序,返回一个新的排序后的列表(原数据不变)。

语法:
sorted(iterable, *, key=None, reverse=False)
  • iterable:可迭代对象(如列表、字典键、字符串)。
  • key:排序依据的函数(高阶函数用法)。
  • reverse:是否降序(默认 False 升序)。
核心逻辑:
  1. 根据 key 函数处理每个元素,生成排序依据的临时值。
  2. 按临时值比较排序。
  3. 返回排序后的新列表。
示例:
① 基本排序(数字/字符串)
nums = [3, 1, 4, 2]
print(sorted(nums))          # 输出: [1, 2, 3, 4]
print(sorted(nums, reverse=True))  # 输出: [4, 3, 2, 1]words = ["banana", "apple", "cherry"]
print(sorted(words))         # 按字母顺序: ['apple', 'banana', 'cherry']
② 使用 key 自定义排序规则
# 按字符串长度排序
words = ["apple", "banana", "cherry"]
print(sorted(words, key=lambda x: len(x)))  # 输出: ['apple', 'banana', 'cherry']# 按字典的某个键排序
students = [{"name": "Alice", "age": 25},{"name": "Bob", "age": 20}
]
print(sorted(students, key=lambda x: x["age"]))  
# 输出: [{'name': 'Bob', 'age': 20}, {'name': 'Alice', 'age': 25}]
③ 多级排序(元组 key
# 先按长度,长度相同按字母逆序
words = ["apple", "banana", "cherry", "date"]
print(sorted(words, key=lambda x: (len(x), -ord(x[0]))))
# 输出: ['date', 'apple', 'cherry', 'banana']
特点:
  • 返回新列表,原数据不变(与 list.sort() 方法不同)。
  • key 参数支持复杂排序逻辑(高阶函数核心用途)。
  • 支持所有可迭代对象(甚至生成器)。
sorted()关键参数:
  • key:指定一个函数,这个函数会作用于每个元素,然后根据函数返回的结果进行排序
  • reverse:排序规则,True降序,False升序(默认)

5. 装饰器:函数的化妆师

在 Python 中,装饰器(Decorator) 是一种高阶函数,它的核心作用是在不修改原函数或类代码的前提下,动态地增强或修改其功能。装饰器通过 @ 语法糖实现,是 Python 最强大的特性之一,广泛应用于日志记录、权限验证、性能分析等场景。

作用:
1. 功能增强
  • 不侵入原代码:无需修改函数/类内部逻辑,即可添加新功能(如日志、计时、缓存等)。
  • 代码复用:将通用功能(如权限检查)抽象为装饰器,避免重复代码。
2. 行为修改
  • 控制访问:限制函数调用(如登录验证、API 限流)。
  • 修改返回值:对函数返回结果进行二次处理(如数据格式化)。
3. 元编程
  • 动态注册:自动注册函数到框架(如 Flask 路由 @app.route)。
  • AOP(面向切面编程):分离核心逻辑与横切关注点(如事务管理)。
语法:

装饰器本质上是一个接收函数/类作为参数,并返回修改后的函数/类的可调用对象。其底层实现基于闭包和高阶函数。

def decorator(func):          # 1. 接收目标函数def wrapper(*args, **kwargs):  # 3. 定义增强逻辑# 前置增强(如权限检查)result = func(*args, **kwargs)  # 4. 调用原函数# 后置增强(如日志记录)return resultreturn wrapper            # 2. 返回包装后的函数@decorator  # 等价于 func = decorator(func)
def func():pass
示例:
① 日志记录
def log_call(func):def wrapper(*args, **kwargs):print(f"调用 {func.__name__},参数: {args}, {kwargs}")return func(*args, **kwargs)return wrapper@log_call
def add(a, b):return a + badd(2, 3)  # 输出: 调用 add,参数: (2, 3), {}
② 性能计时
import timedef time_it(func):def wrapper(*args, **kwargs):start = time.time()result = func(*args, **kwargs)print(f"{func.__name__} 耗时: {time.time() - start:.2f}s")return resultreturn wrapper@time_it
def slow_function():time.sleep(1)slow_function()  # 输出: slow_function 耗时: 1.00
③ 权限验证
def login_required(func):def wrapper(user, *args, **kwargs):if not user.is_authenticated:raise PermissionError("请先登录")return func(user, *args, **kwargs)return wrapper@login_required
def delete_file(user, filename):print(f"{user.name} 删除了文件 {filename}")# 调用时会自动检查权限
装饰器的分类
1. 函数装饰器
  • 最常用形式,作用于函数。
@decorator
def func(): pass
2. 类装饰器
  • 装饰类,可以修改或替换类行为。
def add_method(cls):cls.new_method = lambda self: print("动态添加的方法")return cls@add_method
class MyClass: passobj = MyClass()
obj.new_method()  # 输出: 动态添加的方法
3. 带参数的装饰器
  • 通过嵌套函数实现参数传递。
def repeat(n):def decorator(func):def wrapper(*args, **kwargs):for _ in range(n):result = func(*args, **kwargs)return resultreturn wrapperreturn decorator@repeat(3)
def say_hello():print("Hello")say_hello()  # 输出 3 次 Hello
4. 内置装饰器
  • Python 自带的装饰器,如:
    • @staticmethod / @classmethod:定义静态方法和类方法。
    • @property:将方法转为属性。
    • @functools.lru_cache:缓存函数结果。
装饰器工作原理:
原始函数 → 装饰器 → 增强后的新函数
常见装饰器使用场景:
  • 日志记录
  • 性能测试(如执行时间)
  • 权限校验
  • 缓存
  • 事务处理

三、高阶函数对比表

以下是 Python 中五大高阶函数 map()filter()reduce()sorted() 和装饰器的详细对比表格,包含核心特性和使用场景的直观对比:


1. Python 高阶函数对比表

特性map()filter()reduce()sorted()装饰器
功能对每个元素应用函数转换筛选满足条件的元素累积计算所有元素排序可迭代对象增强或修改函数行为
输入(函数, 可迭代对象)(函数, 可迭代对象)(函数, 可迭代对象[, 初始值])(可迭代对象[, key][, reverse])函数作为输入
输出类型迭代器(需用 list() 转换)迭代器(需用 list() 转换)单个计算结果新列表返回包装后的函数
是否修改原数据❌ 生成新数据❌ 生成新数据❌ 生成新数据❌ 生成新列表❌ 原函数不变
典型用途数据转换(如类型转换、数学计算)数据筛选(如去空值、条件过滤)聚合计算(如求和、求积)排序(支持自定义规则)日志、计时、权限校验、缓存等
依赖模块内置内置from functools import reduce内置语法支持(@
性能特点惰性求值,内存高效惰性求值,内存高效立即计算立即生成新列表运行时增加少量开销
常用搭配lambdafilterreducelambdamaplambdamapkey= 函数、reverse=嵌套装饰器(如 @log @timer
代码示例map(lambda x: x*2, [1,2,3])filter(lambda x: x>0, [-1,0,1])reduce(lambda x,y: x+y, [1,2,3])sorted([3,1,2], reverse=True)@decorator def fn(): pass

2. 关键区别图示

2.1 输入输出流程
map:      [a,b,c] → [f(a), f(b), f(c)]  
filter:   [a,b,c] → [a if f(a)=True, c if f(c)=True]  
reduce:   [a,b,c] → f(f(a,b), c)  
sorted:   [c,b,a] → [a,b,c]  
装饰器:    func → decorated_func
2.2 何时选择哪个?
需求选择的高阶函数
批量修改数据map()
按条件过滤数据filter()
计算总和/最大值等聚合reduce()
排序数据sorted()
给函数添加额外功能装饰器
2.3 性能与内存对比
函数惰性求值内存占用适用数据规模
map()大规模
filter()大规模
reduce()中小规模
sorted()高(生成新列表)中小规模

3. 经典组合用法示例

from functools import reduce# 1. map + filter: 先过滤再转换
numbers = [1, 2, 3, 4, 5]
result = list(map(lambda x: x**2, filter(lambda x: x%2==0, numbers)))
# 结果: [4, 16] (仅偶数平方)# 2. sorted + map: 排序转换后的结果
words = ["apple", "banana", "cherry"]
sorted_by_len = sorted(map(len, words), reverse=True)
# 结果: [6, 6, 5] (按长度降序)# 3. reduce + map: 聚合计算
total = reduce(lambda x,y: x+y, map(float, ["1.5", "2.3"]))
# 结果: 3.8 (字符串转浮点数后求和)# 4. 装饰器 + map: 增强函数功能
@log_execution_time
def square(x):return x**2list(map(square, [1, 2, 3]))  # 自动记录执行时间

4. 总结选择建议

  1. 需要简洁性 → 优先用 map/filter + lambda
  2. 需要可读性 → 简单逻辑用列表推导式,复杂逻辑用高阶函数
  3. 需要性能 → 大数据用 map/filter(惰性求值),避免 reduce 处理大规模数据
  4. 需要扩展功能 → 装饰器是唯一选择

四、高阶函数的链式调用

高阶函数可以链式调用,形成强大的数据处理管道:

from functools import reducenumbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# 链式调用示例:过滤偶数 → 平方 → 求和
result = reduce(lambda x, y: x + y,map(lambda x: x ** 2,filter(lambda x: x % 2 == 0,numbers))
)print(result)  # 输出: 220 (2² + 4² + 6² + 8² + 10²)

数据处理流程

原始数据 → filter(过滤) → map(转换) → reduce(聚合) → 最终结果

五、实际应用案例

案例1:学生成绩处理

students = [{"name": "Alice", "score": 85},{"name": "Bob", "score": 72},{"name": "Charlie", "score": 90},{"name": "David", "score": 68}
]# 找出及格的学生并按分数降序排列
passed_students = sorted(filter(lambda s: s["score"] >= 60, students),key=lambda x: x["score"],reverse=True
)print(passed_students)
# 输出: [{'name': 'Charlie', 'score': 90}, {'name': 'Alice', 'score': 85}, 
#        {'name': 'Bob', 'score': 72}, {'name': 'David', 'score': 68}]

案例2:日志记录装饰器

def log(func):def wrapper(*args, **kwargs):print(f"开始执行: {func.__name__}")result = func(*args, **kwargs)print(f"执行结束: {func.__name__}")return resultreturn wrapper@log
def add(a, b):return a + bprint(add(3, 5))
# 输出:
# 开始执行: add
# 执行结束: add
# 8

六、总结

Python的高阶函数提供了强大的功能抽象能力,让我们能够写出更简洁、更易读的代码。记住这几个关键点:

  1. map() - 对每个元素应用函数:“给我一个函数和一个列表,我会把函数应用到每个元素上”
  2. filter() - 筛选元素:“给我一个条件和一个列表,我会返回满足条件的元素”
  3. reduce() - 累积计算:“给我一个计算规则和一个列表,我会把它们累积成一个结果”
  4. sorted() - 排序:“给我一个列表和排序规则,我会返回排好序的新列表”
  5. 装饰器 - 增强函数:“给我一个函数,我会返回一个功能更强的版本”

通过灵活组合这些高阶函数,你可以优雅地处理各种数据转换和计算任务,写出更"Pythonic"的代码!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flume之选择器:复制和多路复用(比喻化理解

Flume 的选择器决定了Source 如何将数据分发到多个 Channel。这就像 “快递员如何分配包裹到不同的运输通道”,有两种策略:复制和多路复用。 一、复制(Replicating Selector):每个 Channel 都送一份 核心逻辑 将同一…

yolov5 安卓运行

参考博客: 通过Android Studio 将yolov5部署到手机端(新手最新适用版)_怎么将yolo部署手机-CSDN博客 总体跟随参考博客走是没问题,有些细节需要注意: 1 jdk 版本选择,jdk需要17,新版的Android Studio 选择jdk版本方式…

day021-定时任务

文章目录 1. cron1.1 检查是否安装1.2 检查是否开机自启动1.3 配置文件与相关命令1.4 配置文件格式 2. 案例2.1 同步时间2.2 定时备份/etc和/var/log目录2.3 定时巡检脚本 3. 练习三剑客过滤3.1 去重统计ip数量3.2 去重统计第7列 用户访问的url的数量3.3 去重统计第9列 状态码与…

关于(stream)流

Stream 是 Java 8 引入的一个强大的功能,用于处理集合(Collection)或数组中的数据。它提供了一种声明式的编程方式,可以极大地简化对数据的操作,例如过滤、排序、映射和聚合等。 1. 什么是 Stream 流? 定义…

结课作业自选01. 内核空间 MPU6050 体感鼠标驱动程序(二)(完整实现流程)

目录 一. 题目要求-内核空间 MPU6050 体感鼠标驱动程序 二. 伪代码及程序运行流程 三. 主要函数详解(根据代码流程进行详解) 3.1 module_i2c_driver宏(对应“1”) 3.2 mpu_of_match设备树匹配表(对应“2”&#x…

5G 核心网切换机制全解析:XN、N2 与移动性注册对比

摘要 本文深入探讨了 5G 核心网中的三种关键切换方式:基于 XN 接口的切换、基于 N2 接口的切换以及移动性注册更新机制。通过对比分析它们的原理、应用场景和技术差异,帮助读者全面理解 5G 网络中用户移动性管理的核心技术。 1. 引言 随着 5G 技术的广泛应用,用户对网络连…

用深度学习提升DOM解析——自动提取页面关键区块

一、时间轴:一次“抓不到重点”的二手车数据爬虫事故 2025/03/18 09:00 产品经理希望抓取懂车帝平台上“北京地区二手车报价”作为竞品监测数据源。我们初步使用传统XPath方案,试图提取车型、年限、里程、价格等数据。2025/03/18 10:00 初版脚本运行失败…

React与Vue的内置指令对比

React 与 Vue 不同,它没有内置的模板指令系统。React 采用了 JavaScript 优先 的声明式方式,使用 JSX 语法将 HTML 和 JavaScript 结合在一起。因此,React 中没有类似 Vue 的 v-if、v-for、v-bind 等内置指令。 React 中的替代方案 条件渲染…

Spring声明式事务源码全链路剖析与设计模式深度解读

Spring声明式事务源码全链路剖析与设计模式深度解读 作者:AI 日期:2025-05-22 一、前言 Spring事务是企业级开发的基石,但“为什么有时事务失效?”、“不同传播行为背后发生了什么?”、“Spring事务源码到底如何实现&…

云原生安全基础:深入探讨容器化环境中的权限隔离与加固策略

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 在云原生环境中,容器化技术(如 Docker 和 Kubernetes)的广泛应用带来了灵活性与效率,但也引入了新的安全挑…

如何在 ONLYOFFICE 演示文稿中调整段落首行缩进

在制作演示文稿时,保持内容的一致性与可读性至关重要,而段落首行缩进作为格式设置的关键环节,直接影响着整体呈现效果。在本文中,我们将介绍如何通过创建 ONLYOFFICE 宏,快速设置演示文稿中所有段落的首行缩进。 关于 …

[Asp.Net]GridView、Repeater 导出Excel长数字显示成科学计数

类似身份证纯数字的格式时 ,excel默认是数字格式 变成了科学计数法 , GridView:RowDataBound 添加e.Row.Cells[2].Attributes.Add(“style”, “vnd.ms-excel.numberformat:;”); protected void GridView1_RowDataBound(object sender, GridViewRowE…

Ntfs!NtfsReadBootSector函数分析之nt!CcGetVacbMiss中得到一个nt!_VACB结构

第一部分: 1: kd> g Breakpoint 3 hit nt!CcGetVacbMiss: 80a1a19e 6a30 push 30h 1: kd> kc # 00 nt!CcGetVacbMiss 01 nt!CcGetVirtualAddress 02 nt!CcMapData 03 Ntfs!NtfsMapStream 04 Ntfs!NtfsReadBootSector Ntfs…

Linux10正式版发布,拥抱AI了!

📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯…

关于 SSE(Server-Sent Events)过程的简要解剖

Js前端:发送普通请求 fetch(...) .then(()>{}) .catch(()>{})Java后端:接收请求后调用请求处理函数,函数返回一个emiiter对象 public SseEmitter handleRequest(...) {// 创建一个 SseEmitter 对象,用于发送 SSE 事件SseE…

PyTorch 中unsqueeze(-1)用法

unsqueeze(-1) 是 PyTorch 中的一个张量操作,用于‌在指定维度上增加一个长度为1的维度‌(即扩展维度)。具体解析如下: 功能说明 ‌作用位置‌ -1 表示在张量的‌最后一个维度‌后添加新维度。 (等价于 dimlen(tensor.…

RTC技术

什么是RTC RTC(Real time communication)实时通信,是实时音视频的一个简称,我们常说的RTC技术一般指的是WebRTC技术,已经被 W3C 和 IETF 发布为正式标准。由于几乎所有主流浏览器都支持 WebRTC 标准 API ,…

vue+cesium示例:3Dtiles三维模型高度调整(附源码下载)

接到一位知识星友的邀请,实现他需要3Dtiles三维模型的简单高度调整需求,适合学习Cesium与前端框架结合开发3D可视化项目。 demo源码运行环境以及配置 运行环境:依赖Node安装环境,demo本地Node版本:推荐v18。 运行工具:…

详解3DGS

4 可微分的3D高斯 splatting 核心目标与表示选择 我们的目标是从无法线的稀疏SfM点出发,优化出一种能够实现高质量新视角合成的场景表示。为此,我们选择3D高斯作为基本图元,它兼具可微分的体表示特性和非结构化的显式表示优势,既…

构建版本没mac上传APP方法

在苹果开发者的app store connect上架Ios应用的时候,发现需要使用xode等软件来上传iOS的APP。 但是不管是xcode也好,transporter也好,还是命令行工具也好,都必须安装在mac电脑才能使用,。 假如没有mac电脑&#xff0…