我记得我第一次遇到它的时候------我不知道它有什么作用,老实说,我跳过了它,就像这是我永远不需要的什么晦涩的技巧一样。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()