当前位置: 首页 > news >正文

Python 偏函数(functools.partial)详解

在写 Python 程序的过程中,你可能遇到过这样的场景:一个函数参数特别多,但你经常只需要改其中一两个参数,其它都用默认值。这时候如果每次都手动传一堆参数就很烦,这就轮到 偏函数 上场了。它可以提前“固定”部分参数,返回一个新的函数,让你写代码更轻松、更简洁。

参考文章:Python 偏函数 | 简单一点学习 easyeasy.me

目录

  1. 什么是偏函数
  2. functools.partial 简介
  3. 为什么要用偏函数
  4. 基础用法示例
  5. 偏函数不是默认参数
  6. 和 lambda 的区别
  7. 小结

1. 什么是偏函数

“偏函数”这个词可能听起来有点抽象。简单来说,它就是:

固定函数的一部分参数,返回一个新的函数。

这个“新函数”调用时,只需要传剩下的参数就行了。

举个例子:

int('100', base=2)  # 二进制转十进制,结果是 4

我们如果总是处理二进制字符串,可以这么干:

from functools import partial
bin2int = partial(int, base=2)print(bin2int('100'))  # 输出:4

这就用到了偏函数。


2. functools.partial 简介

Python 的标准库 functools 提供了一个叫 partial 的函数,它就是偏函数的实现方式。

from functools import partialpartial(func, *args, **keywords)
  • func:你想偏的函数
  • *args:你想提前固定的位置参数
  • **keywords:你想提前固定的关键字参数

返回的是一个“包了原函数”的新函数。


3. 为什么要用偏函数

  • 减少重复代码

很多时候你要多次调用一个函数,只变一个参数,其它都一样——那不如直接把这些一样的先固定住。

  • 更好地封装

偏函数可以帮助你把一个通用函数“定制化”,用于特定场景。

  • 提升可读性

代码读起来更清晰,比如 bin2int('1011')int('1011', base=2) 一目了然。


4. 基础用法示例

我们来看几个简单的例子,快速理解偏函数的基本用法。

示例1:字符串转数字

from functools import partial# 创建一个专门处理二进制的 int 转换函数
bin2int = partial(int, base=2)print(bin2int('1010'))  # 输出:10

示例2:固定某些参数

def greet(name, greeting, punctuation='!'):return f"{greeting}, {name}{punctuation}"hi_john = partial(greet, 'John', 'Hi')
print(hi_john())         # Hi, John!
print(hi_john(punctuation='...'))  # Hi, John...

5. 偏函数 ≠ 默认参数

有同学可能会问:“那偏函数是不是跟函数的默认参数差不多?”

还真不是,虽然看起来相似,但有本质区别:

默认参数是写函数时定义的:

def greet(name, greeting='Hi'):...

偏函数是“用函数的人”动态创建的:

hi = partial(greet, greeting='Hi')

偏函数更灵活,你不用改原函数定义,就能定制新函数行为。


6. 和 lambda 的区别

你可能也会用 lambda 写类似的逻辑:

bin2int = lambda s: int(s, base=2)

这和 partial 看起来差不多,对吧?

区别在于:

  • partial 更可读、语义清晰
  • lambda 更灵活,但可读性稍差
  • partial 还能被 pickle 序列化(有时候这很重要)

7. 小结

  • 偏函数是一种非常实用的小技巧,能帮你固定部分参数,生成新的函数;
  • functools.partial 就能实现;
  • 适用于减少重复、提高可读性、简化回调和封装;
  • 不同于默认参数和 lambda,更适合特定的编程风格。

不需要学太多奇技淫巧,掌握偏函数,就能让你的 Python 代码更优雅、更简洁。

http://www.dtcms.com/a/319538.html

相关文章:

  • MySQL ORDER BY 语句详细说明
  • SVG组件
  • 96-基于Flask的酷狗音乐数据可视化分析系统
  • 微信小程序常见功能实现
  • OpenCV 入门教程:开启计算机视觉之旅
  • uwsgi 启动 django 服务
  • Next.js 15 重磅发布:React 19 集成 + 性能革命,开发者必看新特性指南
  • CentOS 7 安装 Anaconda
  • 秋招笔记-8.7
  • Redis的三种特殊类型
  • 硬盘哨兵pe版本 v25.70.6 中文免费版
  • 【R语言】 高清美观的 MaxEnt 刀切图(Jackknife)绘制——提升论文质量
  • 基于Qt的Live2D模型显示以及控制
  • DAY33打卡
  • 【Unity输入系统】自定义与双击不冲突的单击Interaction
  • 【第八章】函数进阶宝典:参数、返回值与作用域全解析
  • RedisBloom使用
  • 任务进度状态同步 万能版 参考 工厂+策略+观察者设计模式 +锁设计 springboot+redission
  • itextPdf获取pdf文件宽高不准确
  • 设计模式-装饰模式 Java
  • 客户端利用MinIO对服务器数据进行同步
  • VN1 供应链销量预测建模竞赛技巧总结与分享(七)
  • 四边形面积
  • 极简 5 步:Ubuntu+RTX4090 源码编译 vLLM
  • JavaWeb03——基础标签及样式(表单)(黑马视频笔记)
  • 八、基于GD32 Embedded Builder开发GD32VW553(蓝牙广播)
  • 复杂光照场景漏检率↓76%!陌讯多模态融合算法在打电话识别的边缘部署优化
  • 使用Puppeteer轻松自动化浏览器操作
  • PYLON交叉编译:Ubuntu是x86,编译出arm64上运行的程序
  • 无人机航拍数据集|第8期 无人机海上目标检测YOLO数据集3641张yolov11/yolov8/yolov5可训练