Python 偏函数(functools.partial)详解
在写 Python 程序的过程中,你可能遇到过这样的场景:一个函数参数特别多,但你经常只需要改其中一两个参数,其它都用默认值。这时候如果每次都手动传一堆参数就很烦,这就轮到 偏函数 上场了。它可以提前“固定”部分参数,返回一个新的函数,让你写代码更轻松、更简洁。
参考文章:Python 偏函数 | 简单一点学习 easyeasy.me
目录
- 什么是偏函数
- functools.partial 简介
- 为什么要用偏函数
- 基础用法示例
- 偏函数不是默认参数
- 和 lambda 的区别
- 小结
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 代码更优雅、更简洁。