Python——partial函数的使用


整体说明

  • 在 Python 里,functools 模块中的 partial 函数能够用来创建新函数,这些新函数是对现有函数部分参数预先赋值后的版本

  • 借助这种方式,能简化函数调用,让代码更为简洁,常用在一些较为专业的底层框架中

  • 函数形式:

    1
    2
    3
    from functools import partial

    new_func = partial(func, *args, **kwargs)
    • func 代表原函数
    • argskwargs 分别是要预先设置的位置参数和关键字参数
    • 调用 new_func 时,只需传入剩余未预先设置的参数就行

固定函数参数

  • 假设存在一个加法函数 add(a, b),现在要创建一个专门用于加 10 的新函数:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from functools import partial

    def add(a, b):
    return a + b

    add_ten = partial(add, 10) # 把 a 固定为 10

    print(add_ten(5)) # 输出 15(也就是 10 + 5)
    print(add_ten(10)) # 输出 20(也就是 10 + 10)
    print(add_ten(5, 20)) # 输出 25(此时 10 被 5 覆盖,函数计算的是 5 + 20)
    • 注意:固定的是第一个参数

处理关键字参数

  • 在处理关键字参数 Demo:

    1
    2
    3
    4
    5
    6
    7
    8
    def power(base, exponent):
    return base ** exponent

    square = partial(power, exponent=2) # 固定 exponent 为 2
    cube = partial(power, exponent=3) # 固定 exponent 为 3

    print(square(5)) # 输出 25(即 5^2)
    print(cube(5)) # 输出 125(即 5^3)
    • 注意:可通过关键字参数指明具体参数

需要注意的点

  • 参数顺序问题 :使用 partial 固定参数时,参数是按照位置依次绑定的

    • 比如 partial(func, 10) 会把 10 绑定到 func 的第一个参数上
  • 参数覆盖 :如果预先设置的参数在新函数调用时又被传入了新值,那么新传入的值会覆盖预先设置的值

    • 例如:
      1
      2
      3
      add_ten = partial(add, 10)
      print(add_ten(5)) # 输出 15
      print(add_ten(5, 20)) # 输出 25(此时 10 被 5 覆盖,函数计算的是 5 + 20)
  • 函数属性保留 :通过 partial 创建的新函数会保留原函数的一些属性

    • __name____doc__ 等函数属性还在

附录:与 Lambda 表达式的对比

使用 partiallambda 都能实现参数固定的效果,但它们之间也有区别:

1
2
3
4
5
# 使用 partial
add_ten = partial(add, 10)

# 使用 lambda
add_ten_lambda = lambda x: add(10, x)
  • partial 函数在代码简洁性上表现更优,并且能够保留原函数的元信息
  • lambda 表达式则更为灵活,可以实现更复杂的逻辑