在公众号内阅读原文:这个被你忽略的 Python 宝藏函数

还记得我第一次看到 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 工具箱里最“安静但强大”的一员。

最后修改:2025 年 07 月 14 日
本站福利|微信扫描二维码,永久享受 96 折充话费电费