Pyhon 之 functools

本文深入探讨Python的functools模块,讲解reduce方法如何简化迭代操作,partial方法实现函数参数预设,以及lru_cache装饰器如何利用缓存提升函数调用效率。适合希望提高Python编程技能的读者。
部署运行你感兴趣的模型镜像

Pyhon 之 functools

functools模块

reduce方法

  • reduce方法,顾名思义就是减少
  • reduce(function,sequence[,initial])->value
  • 可迭代对象不能为空;初始值没有提供就在可迭代对象中取一个元素
from functools import reduce
nums = [6,9,4,2,4,10,5,9,6,9]
print(nums)
print(sum(nums))
print(reduce(lambda val,x: val + x,nums))

partial方法

  • 偏函数,把函数部分的参数固定下来,相当于为部分的参数添加了一个固定的默认值,形成一个新的函数并返回

  • 从partial生成的新函数,是对原函数的封装

  • partial方法举例

import functools
def add(x,y)->int:
    return x + y

newadd = functools.partial(add,y=5)

print(newadd(7))
print(newadd(7,y=6))
print(newadd(y=10,x=5))

import inspect
print(inspect.signature(newadd))
12
13
15
(x, *, y=5) -> int
partial函数本质
def partial(func,*args,**kwargs):
    def newfunc(*fargs,**fkwargs):
        newkwargs = kwargs.copy()
        newkwargs.update(fkwargs)
        return func(*(args+fargs),**newkwargs)
    newfunc.func = func
    newfunc.args = args
    newfunc.kwargs = kwargs
    return newfunc

def add(x,y):
    return print(x + y)

foo = partial(add,4)
foo(5)

@fooctools.lru_cache(maxsize = 128 , typed = False)

  • Least-recently-used装饰器。lru,最近最少使用。cache缓存
  • 如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制增长。当maxsize是二的幂时,LRU功能执行得最好
  • 如果typed设置为True,则不同类型的函数参数将单独缓存。例如,f(3)和f(3.0)将被视为具有不同结果的不同调用
  • 举例
import functools
import time
@functools.lru_cache()
def add(x,y,z=3):
    time.sleep(z)
    return x + y

print(add(4,5))
print(add(4.0,5))
add(4,6)
add(4,6,3)
add(6,4)
add(4,y=6)
add(x=4,y=6)
add(y=6,x=4)

lru_cache装饰器

  • 通过一个字典缓存被装饰函数的调用和返回值
  • key是什么?看看下面这段代码
def _make_key(args,kwds,kwd_mark = (object(),)):
	key = args
	if kwds:
		key += kwd_mark
		for item in kwds.items():
			key += item
	elif len(key) == 1 :
		return key[0]
	reutrn key
functools._make_key((4,6){'z':3},False)
functools._make_key((4,6,3),{},False)
functools._make_key(tuple(),{'z':3,'x':4,'y':6},False)
functools._make_key((),{'z':3,'x':4,'y':6},True)

  • lru_cache装饰器
    • 斐波那契数列递归方法的改造
import functools

@functools.lru_cache()
def fib(n):
    return 1 if n<3 else fib(n-1) + fib(n-2)
print([fib(i+1) for i in range(35)])

lru_cache 装饰器应用
  • 适用前提
    • 同样的函数参数一定得到同样的结果
    • 函数执行时间很长,且要多次执行
  • 本质是函数调用的参数==》返回值
  • 缺点
    • 不支持缓存过期,key无法过期、失效
    • 不支持清除操作
    • 不支持分布式,是一个单机的缓存
  • 适用场景,单机上需要空间换时间的地方,可以用缓存来将计算变成快速的查询

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,用户问如何在Python中安装和使用functools模块。首先,我需要确认functools是否是Python标准库的一部分。根据引用[2]和引用[3],functoolsPython标准库模块,属于内置模块,不需要额外安装。所以安装步骤可能只需要确认Python版本是否合适,因为不同版本可能功能不同。 接下来,用户可能已经安装了Python,但不知道如何导入functools。应该指导用户使用`import functools`来引入模块。然后需要解释模块的主要功能,比如引用[1]提到的偏函数、装饰器、缓存等,引用[5]中的wraps装饰器,以及引用[3]中的lru_cache和partial等高级应用。 用户可能想知道具体的使用方法,可以举几个例子,比如使用lru_cache做函数缓存,或者用partial创建偏函数。例如,引用[3]中的lru_cache可以用于优化递归函数的性能,而引用[5]中的wraps装饰器能保留原函数的元数据。 另外,需要注意Python版本的问题,比如lru_cache在3.2+版本才有,而某些装饰器可能需要特定版本。引用[4]提到命名约定,虽然和安装无关,但可能在代码风格上有帮助。 最后,要提醒用户不需要安装,直接导入即可,但确保Python环境正确。可能用户混淆了第三方库和标准库,需要明确指出functools是内置的,不需要pip安装。如果有错误提示,可能需要检查拼写或Python安装是否正确。</think>### 如何在Python中安装和使用`functools`模块? `functools`是Python标准库的一部分,无需额外安装。它提供了一系列工具函数,用于优化和增强函数行为,例如函数缓存、偏函数、装饰器等[^1][^2][^3]。 --- #### **1. 确认Python环境** 确保已安装Python(建议使用Python 3.3及以上版本,以支持全部功能)。通过以下命令检查版本: ```bash python --version ``` --- #### **2. 导入`functools`模块** 直接在代码中导入即可: ```python import functools ``` --- #### **3. 核心功能及使用示例** ##### **(1) 函数缓存:`lru_cache`** 用于缓存函数结果,优化重复计算的性能(如递归函数)。 ```python from functools import lru_cache @lru_cache(maxsize=128) def fibonacci(n): if n < 2: return n return fibonacci(n-1) + fibonacci(n-2) ``` ##### **(2) 偏函数:`partial`** 固定函数的部分参数,生成新函数: ```python from functools import partial def power(base, exponent): return base ** exponent square = partial(power, exponent=2) # 固定指数为2 print(square(3)) # 输出9 ``` ##### **(3) 装饰器工具:`wraps`** 保留被装饰函数的元数据(如函数名、文档字符串)[^5]: ```python from functools import wraps def my_decorator(func): @wraps(func) def wrapper(*args, **kwargs): print("装饰器逻辑") return func(*args, **kwargs) return wrapper @my_decorator def example(): """示例函数""" pass print(example.__name__) # 输出"example",而非"wrapper" ``` ##### **(4) 函数排序:`cmp_to_key`** 将旧式比较函数转换为键函数,用于排序: ```python from functools import cmp_to_key def compare(a, b): return a - b # 升序排序 sorted_list = sorted([3, 1, 2], key=cmp_to_key(compare)) print(sorted_list) # 输出[1, 2, 3] ``` --- #### **4. 常见问题** - **错误提示`ModuleNotFoundError`?** 检查Python环境是否安装正确,或模块名拼写是否为`functools`(非第三方库,无需`pip install`)。 - **如何查看全部功能?** 使用`dir(functools)`或查阅[官方文档](https://docs.python.org/3/library/functools.html)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值