Python作为一种支持多范式的编程语言,除了在“一切皆对象”的理念支持下的,函数对象也是一等公民、各种高阶函数的自然实现、lambda表达式快速编写纯函数之外。还有一个内置的模块functools,能够更好地支持我们在Python中应用函数式编程。
本文的主要内容有:
1、functools模块概览
2、偏函数
3、自定义排序
4、属性缓存
5、其他已经介绍过的功能
functools模块概览functools模块是Python标准库中的一部分,提供了一系列高阶函数和操作函数的工具,涵盖了偏函数、聚合操作、性能优化、多态处理、装饰器开发、自定义排序和属性缓存等多种功能。
通过理解和使用这些工具,可以大大提高代码的灵活性、性能和可维护性。无论是函数式编程,还是面向对象编程等,在日常的开发任务中,functools都是一个不可或缺的利器。
偏函数functools模块有很多重要的功能,其中一个就是偏函数(Partial function)。
需要注意的是,这里的偏函数与数学意义上的偏函数(偏导数)是不一样的。
Python中的偏函数是用于对函数固定参数的函数,作用就是把一个函数中的某些参数固定住,类似于设置默认值的逻辑,返回一个新的函数,从而使得多元函数的调用变得更加简单,从而对使用者更加友好。
先看下定义:
然后以实际代码看一下partial的使用:
执行结果:
需要说明的是,偏函数虽然与柯里化比较相似,但是,两者在使用上还是有所区别的。偏函数是固定部分参数,直接生成新的函数。而柯里化,是逐步进行函数参数的传递,嵌套函数,每个函数只接收一个参数。在调用上,偏函数是一次性传递所有剩余参数,柯里化是逐层传递每一个参数。
自定义排序functools模块提供了一个total_ordering的装饰器,用于自动生成缺失的排序方法。
首先看下定义:
只要定义比较方法,比如<、>、<=、>=中的一个方法,该装饰器可以帮助自动推导出另外几个方法。
还是直接看代码:
执行结果:
可以看到,我们在代码中只定义了__lt__方法,total_ordering装饰器自动根据该方法实现了另外3个用于比较的方法。
需要说明的是,==、!=还是自行定义__eq__方法来实现。
属性缓存在面向对象中,我们介绍过property属性装饰器,有些计算的属性,如果比较消耗性能,还可以使用functools中提供的cached_property来实现计算结果的缓存。
直接以代码为例:
执行结果:
可以看到,第二次调用时,并没有执行area()方法的调用。
其他已经介绍过的功能functools中还有其他功能,我们在前面的文章中都已经介绍过了,这里就不展开详细说明了,只是简单列举回顾一下:
1、functools.reduce:用于将一个二元操作函数应用于序列,实现累计地将序列元素计算合并为一个结果。
2、functools.lru_cache:装饰器,用于缓存函数的计算结果,从而提高性能,lru是Least Recently Used的缩写,表示缓存采用的最近最少使用的缓存置换策略。
3、functools.singledispatch:装饰器,用于实现单分派泛函数,允许根据第一个参数的类型调用不同的函数实现,近似实现其他语言中的函数重载。
4、functolls.wraps:装饰器,主要用于确保装饰器不修改被装饰函数的元数据。
总结本文详细介绍了functools中的各个核心功能的使用,包括偏函数、自定义排序、缓存属性等。functools模块,不仅可以用于函数式编程,面向对象编程中,也可以发挥巨大的作用。
感谢您的拨冗阅读,希望对您有所帮助。