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