functools 是一个官方库,模块是用于高阶函数,即——参数或(和)返回值为其他函数的函数。通常来说,此模块的功能适用于所有可调用对象。
functools 这个库提供了三个内置函数:partial, lru_cache, wraps
1.partial函数
-
作用:给函数的参数设置默认值(提前给参数设置固定的值)
-
用法:
1.如果每次传参是 X 值都是不变的,都是 Y,那就可以使用partial函数 2.使用partial函数,将 X 的值设定为默认值,用一个新的变量接收,去调用新变量的时候只需要传其他值即可 3.如果参数设置了默认值,在传参是也给值,生效传参的值
实例1:
-
这个函数去调用时,第一个值传的值都是一样的,那就可以用partial函数
def work(name,age,sex): print(name,age,sex) # 每次传参是name都不变,都是henry work("henry",22,33) work("henry",44,55) work("henry",66,77)
-
使用partial函数,将name的值设定为默认值,去调用的时候只需要传其他值即可
# 将name='henry' 设定为默认值 work1 = partial(work,name='henry') # 传值只需要传age,sex work1(age=12,sex=99) # 打印结果为:henry 18 99 # 如果参数设置了默认值,在传参是也给值,生效传参的值 work1(name='henry',age=88,sex=99) # 打印结果为:henry1 88 99
结果:
2. wraps函数的使用
-
作用:将一个函数的特殊属性保存到另一个函数上
-
应用场景:消除装饰器的副作用
实例2:定义一个函数1
# 定义一个func的函数
def func():
'''这是fun函数的注释文档'''
print("-------------- func 函数 ---------------")
func()
print(func.__name__,func.__doc__,func.__dict__)
- func.name : 获取函数名
- func.doc:获取函数的文档字符串注释
- func.dict:获取函数的属性字典
执行结果:
实例3:
- 在定义一个函数2, 使用 @wraps(函数1) 继承函数1的一切属性,去打印函数2时显示函数1的属性
# @wraps(func)
def app():
'''这是app函数的注释文档'''
print("-------------- app 函数 ---------------")
print(app.__name__,app.__doc__,app.__dict__)
app()
打印结果,属性是函数1 的属性
3. lru_cache函数的使用
-
作用:为函数提供缓存功能的装饰器,对函数执行的结果进行缓存
-
应用场景:提升递归函数的执行效率
-
用法:
1. @lru_cache(maxsize=128) # 设置的最大缓存字节 2. 缓存同一个函数相同参数执行的结果
实例4:
@lru_cache(maxsize=128) # 设置的最大缓存字节
def work(n):
if n == 1:
return 1
else:
return work(n - 1) * n
print(work(100))