Myself
  • 1.Python历史
  • 2.安装Python
    • 2.1.Python解释器
  • 3.第一个Python程序
    • 3.1.使用文本编辑器
    • 3.2.输入和输出
  • 4.Python基础
    • 4.1.数据类型和变量
    • 4.2.字符串和编码
    • 4.3.使用list和tuple
    • 4.4.条件判断
    • 4.5.模式匹配
    • 4.6.循环
    • 4.7.使用dict和set
  • 5.函数
    • 5.1.调用函数
    • 5.2.定义函数
    • 5.3.函数的参数
    • 5.4.递归函数
  • 6.高级特性
    • 6.1.切片
    • 6.2.迭代
    • 6.3.列表生成式
    • 6.4.生成器
    • 6.5.迭代器
  • 7.函数式编程
    • 7.1.高阶函数
      • 7.1.1.map/reduce
      • 7.1.2.filter
      • 7.1.3.sorted
    • 7.2.返回函数
    • 7.3.匿名函数
    • 7.4.装饰器
    • 7.5.偏函数
  • 8.模块
    • 8.1.使用模块
    • 8.2.安装第三方模块

搜索结果

没有相关内容~~

7.5.偏函数

最新修改于 2025-08-07 17:04
Python的 `functools`模块提供了很多有用的功能,其中一个就是偏函数(Partial function)。要注意,这里的偏函数和数学意义上的偏函数不一样。 在介绍函数参数的时候,我们讲到,通过设定参数的默认值,可以降低函数调用的难度。而偏函数也可以做到这一点。举例如下: `int()`函数可以把字符串转换为整数,当仅传入字符串时,`int()`函数默认按十进制转换: ```plain >>> int('12345') 12345 ``` []( "复制到剪贴板") 但 `int()`函数还提供额外的 `base`参数,默认值为 `10`。如果传入 `base`参数,就可以做N进制的转换: ```plain >>> int('12345', base=8) 5349 >>> int('12345', 16) 74565 ``` []( "复制到剪贴板") 假设要转换大量的二进制字符串,每次都传入 `int(x, base=2)`非常麻烦,于是,我们想到,可以定义一个 `int2()`的函数,默认把 `base=2`传进去: ```python def int2(x, base=2): return int(x, base) ``` []( "复制到剪贴板") 这样,我们转换二进制就非常方便了: ```plain >>> int2('1000000') 64 >>> int2('1010101') 85 ``` []( "复制到剪贴板") `functools.partial`就是帮助我们创建一个偏函数的,不需要我们自己定义 `int2()`,可以直接使用下面的代码创建一个新的函数 `int2`: ```plain >>> import functools >>> int2 = functools.partial(int, base=2) >>> int2('1000000') 64 >>> int2('1010101') 85 ``` []( "复制到剪贴板") 所以,简单总结 `functools.partial`的作用就是,把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。 注意到上面的新的 `int2`函数,仅仅是把 `base`参数重新设定默认值为 `2`,但也可以在函数调用时传入其他值: ```plain >>> int2('1000000', base=10) 1000000 ``` []( "复制到剪贴板") 最后,创建偏函数时,实际上可以接收函数对象、`*args`和 `**kw`这3个参数,当传入: ```plain int2 = functools.partial(int, base=2) ``` []( "复制到剪贴板") 实际上固定了int()函数的关键字参数 `base`,也就是: ```python int2('10010') ``` []( "复制到剪贴板") 相当于: ```python kw = { 'base': 2 } int('10010', **kw) ``` []( "复制到剪贴板") 当传入: ```python max2 = functools.partial(max, 10) ``` []( "复制到剪贴板") 实际上会把 `10`作为 `*args`的一部分自动加到左边,也就是: ```python max2(5, 6, 7) ``` []( "复制到剪贴板") 相当于: ```python args = (10, 5, 6, 7) max(*args) ``` []( "复制到剪贴板") 结果为 `10`。 ### 参考源码 [do\_partial.py](https://liaoxuefeng.com/books/python/functional/partial/do_partial.py) ### 小结 当函数的参数个数太多,需要简化时,使用 `functools.partial`可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。
开始访问