97% 的 Python 项目可以使用 partial() 更简洁

我记得我第一次遇到它的时候------我不知道它有什么作用,老实说,我跳过了它,就像这是我永远不需要的什么晦涩的技巧一样。functools.partial

稍后快进到几个实际项目,我可以告诉你:partial() 使我的代码更简洁、更可重用,并且编写起来更有趣。

Partial 函数允许您锁定一些参数,因此您不会每次都重复自己。这就像以最少的工作量创建函数的自定义版本。

在这篇文章中,我将向你展示它是如何工作的,我如何在实际代码中使用它,以及为什么它可能只是你还没有使用的最干净的功能。partial()

让我们开始吧。

偏函数语法(基础篇)

当我第一次了解 时,我对语法实际上如此简单感到惊讶。partial()

您只需从 中导入它,然后您可以 "锁定" 一个或多个参数来创建函数的新版本:functools

python 复制代码
Copyfrom functools import partial

# Define a regular function
def func(arg1, arg2, arg3):
    # Do something
    pass

# Create a partial function by fixing some arguments
partial_func = partial(func, fixed_arg1, fixed_arg2)

# Now call it with the remaining arguments
result = partial_func(arg3)

就这么简单。partial 函数的行为与原始函数一样 --- 只是需要担心的参数更少。

一旦我看到它的实际效果,我就开始使用它来简化从回调到重复配置繁重的函数的所有内容。

接下来,我向您展示一个真实的用例。

真实示例 1:我的 BMI 计算器

这是我真正被击中的地方------我一直在跟踪我的体重随时间的变化,并且厌倦了每次计算我的 BMI 时都重新输入我的身高。partial()

所以我过去常常锁定一次我的身高,然后只传入变化的体重:functools.partial

python 复制代码
Copyfrom functools import partial

def calculate_bmi(height: float, weight: float) -> str:
    bmi = weight / (height ** 2)
    return f"Your Body Mass Index (BMI) is {bmi:.2f}."

# Set my height once and reuse the function
bmi_for_my_height = partial(calculate_bmi, height=1.75)

# Track weight changes over time
print(bmi_for_my_height(weight=63))  # 01/01/2024
# → Your Body Mass Index (BMI) is 20.57.

print(bmi_for_my_height(weight=66))  # 01/06/2024
# → Your Body Mass Index (BMI) is 21.55.

只需一行,我就准备好了一个定制的 BMI 计算器。partial()

正是这种小胜利让编码感觉有点神奇。

实际示例 2:城市锁定的天气报告

以前,每次生成天气预报时,我都会传递城市名称。然后我意识到......为什么不修复一次呢?

以下是我是如何做到的:partial()

python 复制代码
Copyfrom functools import partial

def weather_report(city: str, temp: int, rain: bool) -> str:
    return f"""Temperature in {city} is {temp}ºC.
It is {'raining' if rain else 'not raining'}."""

# Regular usage
print(weather_report('Lima', 17, True))
# → Temperature in Lima is 17ºC.
# → It is raining.

# Lock in the city as 'Madrid'
madrid_weather_report = partial(weather_report, city="Madrid")

# Now just update the weather
print(madrid_weather_report(temp=24, rain=False))
# → Temperature in Madrid is 24ºC.
# → It is not raining.

当您处理重复值时,这是完美的 --- 只需修复一次,然后利用快捷方式。

与内置函数一起使用partial()

最酷的事情之一?您也可以使用内置函数。partial()

我希望我的调用使用换行符而不是空格 --- 无需每次都设置。所以我这样做了:print()``sep="\n"

python 复制代码
Copyfrom functools import partial

# Create a version of print with a custom separator
print_with_sep = partial(print, sep="\n")

# Now this prints each item on a new line
print_with_sep("Name: Jaume", "Age: 25", "Pet: Mimi")
# → Name: Jaume
# → Age: 25
# → Pet: Mimi

没有包装器,没有额外的函数 --- 只需一行,就完成了。这种调整使您的代码更整洁,并且立即更具可读性。

部分函数与 Lambda:使用哪一个?

在我熟悉了 之后,我开始将其与另一个常用工具进行比较:lambda 函数 。两者都允许您创建更小、更专业的函数,但它们各有其优势。partial()

部分功能:

-> 作用: 预填充现有函数的参数。

-> 语法partial(existing_func, fixed_args)

->优点

->缺点

-> 示例:

python 复制代码
Copyfrom functools import partial

def power(base, exponent):
    return base ** exponent

# Regular function call for squaring
print(power(5, 2))
# → 25

# Using partial to create a new function for squaring
square = partial(power, exponent=2)
print(square(5))
# → 25

Lambda 函数:

-> 它的作用: 创建匿名的内联函数。

-> 语法lambda args: expression

->优点

->缺点

-> 示例:

python 复制代码
Copy# Using a lambda function to square a number
square = lambda base: base ** 2
print(square(5))
# → 25

那么,使用哪个呢?

两者都很有用,但我发现自己倾向于更复杂、可重用的逻辑。你怎么样?您的编码风格更喜欢其中一种吗?partial()

部分函数的优点

现在我一直在使用 ,我不能忽视它带来的主要好处。以下是它改变我的代码游戏规则的原因:partial()

1. 可重用性

使用 ,我可以重用现有函数,但锁定一些参数,从而创建专用版本。无需每次都重新键入代码或重新定义函数 --- 只需使用其余参数调用 partial 函数即可。partial()

2. 代码简化

你不得不传递相同的参数多少次? 消除那个。我可以在一个位置修复某些值,这使得将来的调用更简单、更清晰。partial()

3. 可读性

通过锁定参数,函数调用变得更加可读。函数的作用以及哪些参数是"预设的",这立即变得一目了然,从而减少了任何阅读代码的人的认知负担。

4. 定制

自定义通用函数非常简单。我只需设置一次固定参数,即可获得该函数的定制版本。这就像以最小的工作量为您的项目构建自定义工具。

5. 模块化

partial()有助于将复杂的函数分解为更小、可重用的组件。我可以专注于特定任务,创建易于维护的模块化代码块,而不是重复逻辑。

简而言之,部分函数让我更聪明地工作,而不是更努力地工作。一旦你开始使用它们,你会想知道没有它们你是怎么度过的。

因此,如果您还没有探索过,请试一试。它可能会成为您在 Python 函数世界中最好的新朋友。partial()

相关推荐
电商数据girl4 分钟前
产品经理对于电商接口的梳理||电商接口文档梳理与接入
大数据·数据库·python·自动化·产品经理
三道杠卷胡30 分钟前
【AI News | 20250424】每日AI进展
人工智能·pytorch·python·语言模型·github
T糖锅G1 小时前
小白自学python第二天
python
满怀10152 小时前
【OpenCV图像处理实战】从基础操作到工业级应用
图像处理·人工智能·python·opencv·计算机视觉·编程入门
AI视觉网奇2 小时前
四元数转旋转矩阵
人工智能·pytorch·python
Bruce_Liuxiaowei3 小时前
基于Python+Flask的MCP SDK响应式文档展示系统设计与实现
开发语言·python·flask·mcp
PyAIGCMaster3 小时前
Vscode已经打开的python项目,如何使用已经建立的虚拟环境
ide·vscode·python
Tiger_shl3 小时前
【Python语言基础】24、并发编程
java·数据库·python
<<3 小时前
基于Django的权限管理平台
后端·python·django
QMT量化交易4 小时前
如何解决PyQt从主窗口打开新窗口时出现闪退的问题
python·pyqt