0Pricing
Python Academy · 课时

偏函数

使用 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 一等函数
  2. 闭包与自由变量
  3. nonlocal 与可变状态
  4. 偏函数
← 返回 Python Academy