还记得我第一次看到 functools.partial
的时候,完全不知道它是干嘛的,扫一眼就跳过去了,以为是某种没什么用的骚操作。
结果过了几年,写了几个实际项目之后,我才意识到:partial()
不但让我的代码更简洁、更易复用,甚至写起来都更顺手。
简单来说,partial函数可以“预先填好一部分参数”,让你后续调用的时候不用每次都重复输一遍。就像是给某个函数做了一个定制版小封装。
这篇文章就带你搞清楚 partial()
的用法、实战场景,以及它为什么可能是你还没用过的“最干净的代码优化工具”。
基本语法:真的很简单
刚开始接触 partial()
时,我还以为会有很多门道,结果发现用起来超级直接。
只需要引入:
from functools import partial
然后给函数“锁定”几个参数:
def func(arg1, arg2, arg3):
pass # 原始函数
# 固定前两个参数
partial_func = partial(func, arg_a, arg_b)
# 只需要传剩下的参数
result = partial_func(arg3)
就是这么简单。这个新的 partial_func
跟原始的 func
本质上是同一个逻辑,只是你不用每次都填满所有参数。
我后来在项目里大量用来优化回调函数、简化配置参数多的函数,效果立竿见影。
定制化的 BMI 计算器
我真正体会到 partial()
带来的快乐,是在写一个 BMI 计算器时。
当时我在追踪体重变化,但每次都要手动填身高,重复得我头都大了。
于是我干脆用 partial()
把身高参数锁死,只管传变化的体重值就行:
from functools import partial
def calculate_bmi(height: float, weight: float) -> str:
bmi = weight / (height ** 2)
return f"您的 BMI 是 {bmi:.2f}"
# 身高写死
bmi_for_my_height = partial(calculate_bmi, height=1.75)
# 每次只输体重
print(bmi_for_my_height(weight=63)) # 输出:您的 BMI 是 20.57
print(bmi_for_my_height(weight=66)) # 输出:您的 BMI 是 21.55
就加了一行 partial()
,结果却是:更清晰的函数调用,更少的重复操作,真正“量身定做”的感觉。
天气预报函数,把城市锁定
以前我写天气预报,总要每次传入城市名。
后来想了下,不如直接把城市锁死,用 partial()
实现一个“专属城市的天气播报器”:
from functools import partial
def weather_report(city: str, temp: int, rain: bool) -> str:
return f"""当前{city}气温:{temp}℃。
是否下雨:{'是' if rain else '否'}"""
# 普通用法
print(weather_report('北京', 30, True))
# 城市锁定为“上海”
shanghai_weather = partial(weather_report, city="上海")
print(shanghai_weather(temp=28, rain=False))
遇到重复参数,这招特别好用。锁住它、别再反复传,让代码更“懂你”。
partial + 内置函数:还能这么玩?
partial()
也能搭配内置函数一起用,比如我有段时间很想让 print()
每次输出都换行分隔(而不是默认空格)。
那就这样写:
from functools import partial
print_with_newline = partial(print, sep="\n")
print_with_newline("姓名:小李", "年龄:24", "宠物:咪咪")
直接搞定。无需新函数、无须封装,代码干净利落,阅读体验也更舒服。
partial vs lambda:谁更合适?
用熟了 partial()
之后,我也开始对比它和 lambda 函数的差异。
partial 函数适合:
- 基于现有函数 去定制新版本(预填参数)
- 保持结构清晰,特别适合大项目复用
- 阅读性更好,看得出是“一个原函数的变种”
from functools import partial
def power(base, exponent):
return base ** exponent
square = partial(power, exponent=2)
print(square(5)) # 输出 25
lambda 函数适合:
- 快速写一段“一次性小函数”
- 灵活、轻便,适合临时处理逻辑
square = lambda base: base ** 2
print(square(5)) # 输出 25
我的选择是:结构清晰的场景用partial()
,写脚本或一两行逻辑就lambda
搞定。
partial() 的五大好处
用了 partial()
之后,以下几点是我真切体会到的提升:
1. 复用性强
不用每次都复制函数或写包装函数,锁住参数之后直接重用。
2. 减少重复代码
避免反复传同样的参数,写一次、用到底。
3. 提高可读性
预设参数让函数名更直观,调用时也能清晰地看出“这函数已经定制好部分功能”。
4. 快速定制函数
你不需要重写函数逻辑,只需设定默认参数,就能生成一个“专属版本”。
5. 增强模块化
把复杂任务拆成几个 partial()
定制的小任务,结构更清晰、维护更方便。
总结一下
partial()
真的是那种用过一次就再也离不开的工具,它不会改变你的函数逻辑,但能大大优化你的代码结构和开发体验。
如果你还没用过 partial()
,不妨试试。它可能会成为你 Python 工具箱里最“安静但强大”的一员。