Python3标准库functools模块工具详解:partial类和函数修饰符

3 下载量 19 浏览量 更新于2024-09-07 收藏 100KB PDF 举报
Python3标准库之functools管理函数的工具详解 Python3标准库中的functools模块提供了多种工具来调整或扩展函数和其他callable对象,从而不必完全重写。本文将详细介绍functools模块提供的主要工具partial类,并通过实例详解展示其使用方法。 1.functools管理函数的工具 functools模块提供了一些工具来调整或扩展函数和其他callable对象,从而不必完全重写。这些工具包括partial类、lru_cache函数、reduce函数、total_ordering函数等。 1.1 修饰符 functools模块提供的主要工具就是partial类,可以用来“包装”一个有默认参数的callable对象。得到的对象本身就是callable,可以把它看作是原来的函数。它与原函数的参数完全相同,调用时还可以提供额外的位置或命名函数。可以使用partial而不是lambda为函数提供默认参数,有些参数可以不指定。 1.1.1 部分对象 partial对象是functools模块提供的主要工具之一,可以用来“包装”一个有默认参数的callable对象。 partial对象具有func、args和keywords三个属性。func属性是原函数,args属性是位置参数,keywords属性是命名参数。 例如,假设我们有一个函数myfunc(a, b=2),可以使用partial来创建一个部分对象p1,p1的默认参数b=4。 ``` import functools def myfunc(a, b=2): "Docstring for myfunc()." print('called myfunc with:', (a, b)) def show_details(name, f, is_partial=False): "Show details of a callable object." print('{}:'.format(name)) print('object:', f) if not is_partial: print('__name__:', f.__name__) if is_partial: print('func:', f.func) print('args:', f.args) print('keywords:', f.keywords) return show_details('myfunc', myfunc) myfunc('a', 3) print() # Set a different default value for 'b', but require # the caller to provide 'a'. p1 = functools.partial(myfunc, b=4) show_details('p1', p1) ``` 在上面的示例中,我们首先定义了一个函数myfunc(a, b=2),然后使用partial来创建一个部分对象p1,p1的默认参数b=4。最后,我们使用show_details函数来展示partial对象的详细信息。 1.2 lru_cache函数 functools模块还提供了lru_cache函数,可以用来缓存函数的结果,从而减少函数的调用次数。lru_cache函数可以缓存函数的结果,以便在下一次调用时可以直接返回缓存的结果,而不需要重新计算。 例如,假设我们有一个函数fibonacci(n),可以使用lru_cache函数来缓存其结果。 ``` import functools @functools.lru_cache(maxsize=None) def fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2) print(fibonacci(10)) # 输出55 ``` 在上面的示例中,我们使用lru_cache函数来缓存fibonacci函数的结果,以便在下一次调用时可以直接返回缓存的结果,而不需要重新计算。 functools模块提供了多种工具来调整或扩展函数和其他callable对象,从而不必完全重写。partial类可以用来“包装”一个有默认参数的callable对象,而lru_cache函数可以用来缓存函数的结果,以便减少函数的调用次数。