Python模块:内置模块functools函数工具详解
Python模块内置模块functools函数工具详解一、开篇高阶函数的工具箱functools模块提供了处理函数和可调用对象的高阶工具。从缓存优化到偏函数从包装保留到函数重载——它是写出优雅Python代码的秘密武器。⌨️ 核心功能fromfunctoolsimport(reduce,partial,lru_cache,wraps,total_ordering,singledispatch,cmp_to_key,cached_property)二、partial预填充参数的偏函数fromfunctoolsimportpartial# partial(func, *args, **kwargs) —— 固定部分参数创建新函数# 这是函数柯里化在Python中的实现# 基础用法defpower(base,exponent):returnbase**exponent squarepartial(power,exponent2)# 固定exponent2cubepartial(power,exponent3)# 固定exponent3print(square(10))# 100 —— 等价于 power(10, 2)print(cube(10))# 1000 —— 等价于 power(10, 3)# 实际应用简化回调函数deflog_event(logger,event_type,message,timestamp):记录事件日志print(f[{timestamp}]{event_type}:{message}(logger{logger}))# 为特定logger创建便利函数importtime app_logpartial(log_event,app)app_log_errorpartial(app_log,ERROR,timestamptime.time())app_log_error(数据库连接失败)# [1718000000.0] ERROR: 数据库连接失败 (loggerapp)# 应用数据处理管道deftransform(data,multiplier,offset,round_digits2):数据转换returnround(data*multiplieroffset,round_digits)# 创建专用转换函数c_to_fpartial(transform,multiplier9/5,offset32,round_digits1)f_to_cpartial(transform,multiplier5/9,offset-32*5/9,round_digits1)print(c_to_f(0))# 32.0print(c_to_f(100))# 212.0print(f_to_c(32))# 0.0三、lru_cache自动缓存函数结果fromfunctoolsimportlru_cache,cacheimporttime# lru_cache —— 最近最少使用缓存# cache —— Python 3.9无限制缓存等同于lru_cache(maxsizeNone)# 基本用法lru_cache(maxsize128)deffibonacci(n):计算斐波那契数——带缓存ifn2:returnnreturnfibonacci(n-1)fibonacci(n-2)# 第一次调用——计算并缓存starttime.perf_counter()print(fibonacci(35))print(f首次:{time.perf_counter()-start:.4f}秒)# 第二次调用——直接返回缓存starttime.perf_counter()print(fibonacci(35))print(f缓存:{time.perf_counter()-start:.6f}秒)# 查看缓存统计print(fibonacci.cache_info())# CacheInfo(hits34, misses36, maxsize128, currsize36)# 清除缓存fibonacci.cache_clear()# ⚠️ lru_cache要求参数是可哈希的# lru_cache装饰器不能用于方法会导致内存泄漏# 实际应用数据库查询缓存lru_cache(maxsize256)defget_user_by_id(user_id):模拟数据库查询print(f查询数据库: user_id{user_id})return{id:user_id,name:f用户{user_id}}print(get_user_by_id(1))# 查询数据库print(get_user_by_id(1))# 缓存命中——不查数据库四、wraps保留函数元信息fromfunctoolsimportwraps# 写装饰器时用wraps保留原函数的元信息# ❌ 没有wraps的装饰器defbad_decorator(func):defwrapper(*args,**kwargs):这是wrapper的文档returnfunc(*args,**kwargs)returnwrapperbad_decoratordefgreet(name):向用户打招呼returnfHello,{name}!print(greet.__name__)# wrapper —— 名字丢了print(greet.__doc__)# 这是wrapper的文档 —— 文档丢了# ✅ 使用wraps的装饰器defgood_decorator(func):wraps(func)defwrapper(*args,**kwargs):这是wrapper的文档returnfunc(*args,**kwargs)returnwrappergood_decoratordefgreet_v2(name):向用户打招呼returnfHello,{name}!print(greet_v2.__name__)# greet_v2 —— 正确print(greet_v2.__doc__)# 向用户打招呼 —— 正确# wraps是写装饰器的标配——不加它会导致调试困难五、其他实用工具5.1 singledispatch——函数重载fromfunctoolsimportsingledispatchsingledispatchdefformat_output(data):根据参数类型调用不同的格式化函数returnstr(data)format_output.register(list)def_(data):return[, .join(format_output(item)foritemindata)]format_output.register(dict)def_(data):items[f{k}:{format_output(v)}fork,vindata.items()]return{, .join(items)}format_output.register(int)def_(data):returnf{data:,}# 千位分隔print(format_output(1234567))# 1,234,567print(format_output([1,hello,[2,3]]))# [1, hello, [2, 3]]print(format_output({name:张三,age:25}))# {name: 张三, age: 25}5.2 cached_property——惰性属性fromfunctoolsimportcached_propertyimporttimeclassDataAnalyzer:def__init__(self,data):self.datadatacached_propertydefstatistics(self):计算统计信息——只计算一次结果被缓存print(正在计算统计数据...)time.sleep(0.5)# 模拟耗时计算return{sum:sum(self.data),avg:sum(self.data)/len(self.data),min:min(self.data),max:max(self.data),}analyzerDataAnalyzer([1,2,3,4,5])print(analyzer.statistics)# 计算打印正在计算...print(analyzer.statistics)# 缓存命中不打印# cached_property与property不同——它像实例属性一样直接访问5.3 total_ordering——自动补全比较方法fromfunctoolsimporttotal_orderingtotal_orderingclassVersion:版本号——只需定义__eq__和__lt__其余比较方法自动生成def__init__(self,major,minor,patch):self.majormajor self.minorminor self.patchpatchdef__eq__(self,other):return(self.major,self.minor,self.patch)\(other.major,other.minor,other.patch)def__lt__(self,other):return(self.major,self.minor,self.patch)\(other.major,other.minor,other.patch)def__repr__(self):returnfv{self.major}.{self.minor}.{self.patch}v1Version(1,2,3)v2Version(2,0,0)print(v1v2)# Trueprint(v1v2)# True —— 自动生成print(v1v2)# False —— 自动生成print(v1!v2)# True —— 自动生成六、总结functools是编写优雅Python函数代码的必备工具箱。从缓存优化到装饰器编写它让高阶函数编程变得简单而正确。核心工具工具一句话partial()固定参数→创建新函数lru_cache()自动缓存→加速递归和重复调用wraps()保留装饰函数的元信息cached_property惰性计算→只算一次singledispatch根据类型选择实现total_ordering补全所有比较方法✅写装饰器→用wraps慢递归→用lru_cache重复参数→用partial。

相关新闻

Django多表全文搜索实战:Haystack+Jieba+Whoosh集成与API设计

Django多表全文搜索实战:Haystack+Jieba+Whoosh集成与API设计

1. 项目概述与核心痛点最近在重构一个老旧的内部管理系统,后端用的是Django 2.2.7,前端是Vue,典型的分离架构。其中一个核心需求是全文搜索,涉及多个模型表,比如文章、用户、产品信息。技术栈选型上,我沿用…

2026/8/2 22:50:05阅读更多 →
SharpXDecrypt:三分钟找回Xshell遗忘密码的专业解决方案

SharpXDecrypt:三分钟找回Xshell遗忘密码的专业解决方案

SharpXDecrypt:三分钟找回Xshell遗忘密码的专业解决方案 【免费下载链接】SharpXDecrypt Xshell全版本密码恢复工具 项目地址: https://gitcode.com/gh_mirrors/sh/SharpXDecrypt 你是否曾因忘记Xshell保存的服务器密码而陷入困境?当紧急需要登录…

2026/8/2 22:50:05阅读更多 →
I2C从设备模拟:ESP32-Bit-Pirate伪装传感器与EEPROM的完整指南

I2C从设备模拟:ESP32-Bit-Pirate伪装传感器与EEPROM的完整指南

I2C从设备模拟:ESP32-Bit-Pirate伪装传感器与EEPROM的完整指南 【免费下载链接】ESP32-Bit-Pirate A Hardware Hacking Tool with Web-Based CLI That Speaks Every Protocol 项目地址: https://gitcode.com/GitHub_Trending/es/ESP32-Bit-Pirate ESP32-Bit…

2026/8/2 22:50:05阅读更多 →
WordPress编辑器对比与全站编辑指南

WordPress编辑器对比与全站编辑指南

自 WordPress 引入古腾堡(Gutenberg)区块编辑器以来,关于“经典编辑器 vs 古腾堡”以及“全站编辑(FSE)”的讨论一直是社区的热门话题。对于进行 wordpress建站 的企业、内容创作者与开发者而言,选择匹配自…

2026/8/3 2:17:26阅读更多 →
OPD爆火:大模型蒸馏,从抄知识变成抄判断力

OPD爆火:大模型蒸馏,从抄知识变成抄判断力

文章目录1. 先唠唠:为啥传统蒸馏不够用了1.1 以前的玩法,本质就是抄答案1.2 现在卷的方向,早就变了2. 捋一捋:大模型对齐的进化之路2.1 从认字到会说话2.2 从会说话到说人话2.3 最后到学霸直接带飞3. 说人话:OPD到底是…

2026/8/3 2:17:26阅读更多 →
SpringBoot高校超市管理系统开发实战

SpringBoot高校超市管理系统开发实战

1. 项目背景与核心价值高校超市作为校园生活服务的重要场景,传统管理模式普遍存在三个痛点:手工记账效率低下、库存管理混乱、销售数据分析缺失。我去年为某高校改造的超市系统,上线后人力成本降低40%,库存周转率提升25%&#xff…

2026/8/3 2:17:26阅读更多 →
UE5 CommonUI框架实战:构建现代化游戏菜单系统

UE5 CommonUI框架实战:构建现代化游戏菜单系统

1. 项目概述:为什么需要一个“现代化”的菜单系统?如果你用UE5做过几个项目,尤其是涉及到手柄操作或者需要频繁切换界面的游戏,大概率已经对传统的UMG菜单系统感到头疼了。按钮焦点乱跳、返回逻辑需要手动绑定、界面层级一复杂就难…

2026/8/3 2:17:26阅读更多 →
解决UE5.2.1中Quixel Bridge的uAsset不可用错误:从诊断到修复

解决UE5.2.1中Quixel Bridge的uAsset不可用错误:从诊断到修复

1. 项目概述:当Quixel Bridge在UE5.2.1中“罢工”如果你正在使用虚幻引擎5.2.1,并且试图通过Quixel Bridge将那些令人惊叹的Megascans资产拖入你的项目,却迎面撞上“下载失败:uAsset格式不可用”这个冰冷的错误提示,相…

2026/8/3 2:17:26阅读更多 →
从原理到实战:系统性排查与解决502网关错误的完整指南

从原理到实战:系统性排查与解决502网关错误的完整指南

1. 项目概述:从一次深夜告警说起凌晨两点,手机突然开始疯狂震动。我揉着惺忪的睡眼一看,监控告警平台一片飘红,核心服务的状态页面上,那个熟悉的、令人头疼的“502 Bad Gateway”错误再次出现。用户投诉瞬间涌入&#…

2026/8/3 2:15:26阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 0:29:53阅读更多 →
限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

限时公开!某头部SaaS公司内部AI模板工厂架构文档(含5类行业模板源码+性能压测报告)

更多请点击: https://intelliparadigm.com 第一章:AI模板批量生成的核心价值与落地全景 AI模板批量生成正从实验性工具演进为现代软件工程的关键基础设施。它通过语义理解、上下文感知与结构化约束,将重复性高、模式明确的代码/文档/配置生成…

2026/8/3 0:33:53阅读更多 →
如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南

如何快速找回消失的网页:Web Archives浏览器扩展终极指南 【免费下载链接】web-archives Browser extension for viewing archived and cached versions of web pages, available for Chrome, Edge and Safari 项目地址: https://gitcode.com/gh_mirrors/we/web-a…

2026/8/3 0:20:37阅读更多 →
3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:32阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:32阅读更多 →
无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理

无损视频剪辑终极指南:如何实现快速高效的多媒体处理 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 在数字媒体创作领域,视频编辑处理的质量损…

2026/8/2 1:29:34阅读更多 →
AI辅助本科论文写作:8大工具评测与高效使用指南

AI辅助本科论文写作:8大工具评测与高效使用指南

1. 本科生论文写作的AI辅助现状本科毕业论文是每个大学生必须跨越的一道坎。记得我当年写论文时,光是文献检索就花了整整两周时间,打印的参考文献堆满了半个书桌。如今AI技术的发展为学术写作带来了革命性变化,合理使用这些工具可以节省80%以…

2026/8/2 2:32:55阅读更多 →
如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手

如何快速配置大麦自动抢票系统:从零开始搭建Python抢票助手 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase 还在为抢不到热门演唱会门票…

2026/8/2 2:09:20阅读更多 →