偏函数
使用 functools.partial
偏函数 是 CoddyKit 上的免费 Python Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Python Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Python Academy 课程共包含 4 节课。
什么是 partial
functools.partial 会创建一个新函数,并预先填入现有函数的部分参数。它就像预先加载参数,这样您调用结果函数时需要提供的参数就更少。
请使用 from functools import partial 导入它。
from functools import partial
def power(base, exp):
return base ** exp
square = partial(power, exp=2)
print(square(5))固定位置参数
传给 partial 的位置参数会从左侧开始填入函数的参数。调用 partial 时再提供剩余参数。
from functools import partial
def multiply(a, b):
return a * b
double = partial(multiply, 2)
print(double(10))
print(double(50))固定关键字参数
传给 partial 的关键字参数会成为默认值,但您仍然可以在调用时覆盖它们。
from functools import partial
def greet(name, greeting='Hello'):
return greeting + ', ' + name
hola = partial(greet, greeting='Hola')
print(hola('Ada'))
print(hola('Bob', greeting='Hey'))将 partial 用于内置函数
您也可以对内置函数使用 partial。这里我们利用 int 创建一个二进制整数解析器。
from functools import partial
binary = partial(int, base=2)
print(binary('1010'))
print(binary('1111'))更简洁的回调
当您必须传递一个无参数或单参数函数,但又想预先加载上下文时,partial 非常有用。
from functools import partial
def log(level, message):
return '[' + level + '] ' + message
error = partial(log, 'ERROR')
print(error('disk full'))映射中的 partial
partial 可以很好地嵌入 map 这样的高阶函数中,固定一个参数,同时让另一个参数随每个项目变化。
from functools import partial
def add(a, b):
return a + b
add10 = partial(add, 10)
print(list(map(add10, [1, 2, 3])))检查 partial
partial 对象通过 .func 暴露被包装的函数,通过 .args 暴露固定的位置参数,并通过 .keywords 暴露固定的关键字参数。
from functools import partial
def f(a, b, c):
return (a, b, c)
p = partial(f, 1, c=3)
print(p.func.__name__)
print(p.args)
print(p.keywords)叠加 partial
您可以基于另一个 partial 构建新的 partial,逐步叠加更多固定参数。
from functools import partial
def volume(l, w, h):
return l * w * h
base = partial(volume, 2)
slab = partial(base, 3)
print(slab(4))partial 与匿名函数的比较
lambda 也可以完成相同的工作,但在固定参数方面,partial 通常更清晰,并且它会暴露被包装的函数以便自省。
from functools import partial
def power(base, exp):
return base ** exp
cube_p = partial(power, exp=3)
cube_l = lambda b: power(b, 3)
print(cube_p(2), cube_l(2))实际示例:四舍五入
通过对内置的 round 使用 partial,创建一个保留两位小数的舍入函数。
from functools import partial
round2 = partial(round, ndigits=2)
print(round2(3.14159))
print(round2(2.71828))用于类的 partialmethod
相关的 functools.partialmethod 可以在类定义中的方法内完成相同的工作,预先填入方法的参数。
from functools import partialmethod
class Light:
def set(self, state):
self.state = state
return state
on = partialmethod(set, True)
off = partialmethod(set, False)
l = Light()
print(l.on())
print(l.off())快速检查
functools.partial 的作用是什么?
回顾:partial 函数
您已经了解到,functools.partial:
- 创建一个预先填入部分参数(位置参数或关键字参数)的新函数。
- 允许您在调用时覆盖预设的关键字默认值。
- 非常适合用于回调、
map以及减少重复代码。 - 暴露
.func、.args和.keywords,并且有一个方法变体partialmethod。
from functools import partial
add = lambda a, b: a + b
plus1 = partial(add, 1)
print(plus1(41))常见问题解答
「偏函数」课时是免费的吗?
是的 — 「偏函数」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Python Academy 课程的其余内容,请升级到 CoddyKit PRO。 Python Academy 课程共包含 4 节课。
「偏函数」这节课中我会学到什么?
使用 functools.partial 你通过在浏览器中直接运行的动手代码来练习 Python Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Python Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Python Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「偏函数」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Python Academy 课中编写并运行代码吗?
能。每节 Python Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。