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。

相关新闻

Python模块:内置模块itertools迭代工具全解析

Python模块:内置模块itertools迭代工具全解析

Python模块:内置模块itertools迭代工具全解析一、开篇:迭代器的瑞士军刀 itertools是Python标准库中的"高性能迭代工具箱"——所有函数都用C实现,比手写的Python循环快得多。它提供了构建高效迭代管道的积木块:无限序列…

2026/10/17 16:53:21 阅读更多 →
SQL AI助手开发

SQL AI助手开发

1. 项目说明本项目以 MySQL 8.0 DBA 运维核心知识点为基础,结合硅基流动开源大模型 API,构建一套电商订单库智 能查询与性能调优系统。系统可接收业务自然语言自动生成合规 MySQL 查询语句,自动执行查询并输出结构化表格,依托大模…

2026/10/11 4:06:52 阅读更多 →
C#三大Timer深度解析:从UI更新到后台任务的正确选择

C#三大Timer深度解析:从UI更新到后台任务的正确选择

1. 项目概述:为什么C#开发者需要了解不同的Timer?在C#开发中,无论是桌面应用、后台服务还是Web应用,定时任务都是一个绕不开的话题。你可能需要定时刷新UI、轮询数据库、发送心跳包或者执行周期性的数据清理。乍一看,S…

2026/10/3 11:47:36 阅读更多 →

最新新闻

公钥密码学与伪随机数:密钥生成中的随机源与熵池管理

公钥密码学与伪随机数:密钥生成中的随机源与熵池管理

1. 从一个看似矛盾的问题说起公钥密码学里有一个特别反直觉的事实:你用来加密的密钥是公开的,任何人都能拿到,但别人依然解不开你的密文。这件事第一次接触会觉得像魔术,但支撑它的数学基础其实相当朴素——单向函数。正向计算容易…

2026/10/18 0:48:30 阅读更多 →
信息安全意识PPT设计:从知道到做到的行为转化工具包

信息安全意识PPT设计:从知道到做到的行为转化工具包

简介:本资源是一份面向全民网络安全素养提升的国家网络安全宣传周主题PPT课件,适用于企事业单位安全培训、高校通识教育及社区科普宣讲等场景。内容紧扣信息泄露风险防范与网络安全意识培养,系统梳理了网络安全四大核心特征(机密性…

2026/10/18 0:48:30 阅读更多 →
Hy3-oQ2模型卡深度解读:什么是oQ校准量化,2.7 bits/weight意味着什么

Hy3-oQ2模型卡深度解读:什么是oQ校准量化,2.7 bits/weight意味着什么

【免费下载链接】Hy3-oQ2 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Hy3-oQ2 点击查看 免费下载 Hy3-oQ2 是腾讯混元 Hy3(295B MoE)大模型的 MLX oQ 校准量化版本:以 2.7 bits/weight 的有效精度,把…

2026/10/18 0:48:30 阅读更多 →
LayoutLM v3深度解析:多模态文档智能模型微调实战

LayoutLM v3深度解析:多模态文档智能模型微调实战

每次看到开源社区放出的文档智能模型有实质更新,我都要停下来仔细研究一番,LayoutLM系列就是这中间绕不开的名字。这个系列从最初把文本、布局、图像三种模态塞进同一个预训练框架开始,一步步变成了表格解析、票据识别、合同信息抽取这些场景…

2026/10/18 0:46:29 阅读更多 →
Event2Mind:让机器从事件文本中推理意图与反应

Event2Mind:让机器从事件文本中推理意图与反应

每次读到关于事件理解的研究,我都会习惯性地先想一个问题:机器读一句话,真的“读懂了”吗?拿“这个人被公司开除了”来说,字面上是一个解雇事件,但稍微有点常识的人都会接着想:他慌不慌&#xf…

2026/10/18 0:46:29 阅读更多 →
向量与矩阵范数详解:从L1/L2到谱范数的机器学习应用指南

向量与矩阵范数详解:从L1/L2到谱范数的机器学习应用指南

1. 为什么我们要关心“范数”这个数学工具第一次接触“范数”这个词,很多人会觉得它离实际开发很远,像是数学系课本里才会出现的抽象概念。但如果你做过机器学习、数值计算、信号处理,甚至只是用过正则化去调一个过拟合的模型,那你…

2026/10/18 0:46:29 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →