functools 模块应用于高阶函数,即参数或返回值为其他函数的函数。 通常来说,此模块的功能适用于所有可调用对象。
partial
返回一个新的可调用对象,当被调用时可以像平常的函数一样传入 位置参数 和 关键字参数 来得到对应的返回结果。
import functools
def add1(a, /, overwrite_b):
return a + overwrite_b
def add2(overwrite_a, b):
return overwrite_a + b
def add3(overwrite_a, overwrite_b, c):
return overwrite_a + overwrite_b + c
# 覆盖指定关键词参数
add1_1: functools.partial = functools.partial(add1, overwrite_b=1)
add1_2: functools.partial = functools.partial(add1, overwrite_b=2)
print(add1_1(10), add1_2(10))
# 覆盖第一个位置参数
add2_1: functools.partial = functools.partial(add2, 1)
add2_2: functools.partial = functools.partial(add2, 2)
print(add2_1(10), add2_2(10))
# 覆盖第一个和第二个位置参数
add3_1: functools.partial = functools.partial(add3, 1, 2)
add3_2: functools.partial = functools.partial(add3, 2, 3)
print(add3_1(10), add3_2(10))
reduce
与 python 内置的 reduce 函数功能类似;
将两个参数的 function 从左至右累计地应用到 iterable 的值;
例如,reduce (lambda x, y: x+y,[1, 2, 3, 4, 5]) 是计算 ((((1+2)+3)+4)+5) 的值。
如果传入了 initializer (可选),它会被放在参与计算的 iterable 的值之前,也就是计算的初始值。
import functools
# 加法计算
def add(x, y):
return x + y
# 乘法计算
def multiplicative(x, y):
return x * y
# 累加列表值
a = functools.reduce(add, [1, 2, 3, 4])
print(a)
# 累乘列表值
m = functools.reduce(multiplicative, [1, 2, 3, 4])
print(m)
# 携带初始值
a = functools.reduce(add, [1, 2, 3, 4], 1)
print(a)
# 携带初始值,列表为空
a = functools.reduce(add, [], 1)
print(a)
functools.cmp_to_key(func)
将 (旧式的) 比较函数转换为新式的 key function.
在类似于 sorted (), min (), max (), heapq.nlargest (), heapq.nsmallest (),itertools.groupby () 等函数的 key 参数中使用。
import functools
# 比较函数
def cmp(x, y):
return x - y
a = [5, 1, 2, 2, 2, 3, 1, 4]
k = functools.cmp_to_key(cmp)
print(sorted(a, key=k))
functools.total_ordering
给定一个声明一个或多个全比较排序方法的类,这个类装饰器实现剩余的方法。
import functools
@functools.total_ordering
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
return self.age < other.age
def __eq__(self, other):
return self.name == other.name
# 我们只需要定义 __eq__ 和 __lt__,total_ordering就会把其他的比较函数生成好。
Tower = Person('Tower', 1200)
John = Person('John', 12)
print(Tower > John)
functools.update_wrapper
更新一个 装饰器 以使其更像被该装饰器装饰的函数。
可选参数为指定被装饰的函数的哪些属性要赋值给 装饰器 的对应属性;
import functools
# 定义装饰器
def hi(func):
def wrapper():
"""
wrapper 的 doc
"""
print("Hi geeks")
func()
# 更新装饰器,可以注释掉运行查看没有更新的执行结果
# functools.update_wrapper 的功能
# 使用 hello 的 __name__ 和 __doc__ 等属性覆盖 wrapper 的对应属性
functools.update_wrapper(wrapper, func)
return wrapper
@hi
def hello():
"""
hello 的 __doc__
"""
print("Hey Geeks")
print("hello.__name__", hello.__name__)
print("hello.__doc__", hello.__doc__)
help(hello)
print(hello())
functools.wraps
可用作一个装饰器,简化调用 update_wrapper 的过程;
import functools
# 定义装饰器
def hi(func):
@functools.wraps(func)
def wrapper():
"""
wrapper 的 doc
"""
print("Hi geeks")
func()
return wrapper
@hi
def hello():
"""
hello 的 __doc__
"""
print("Hey Geeks")
print("hello.__name__", hello.__name__)
print("hello.__doc__", hello.__doc__)
help(hello)
print(hello())