Python--functools模块

functools模块

reduce方法

  • reduce方法,顾名思义就是减少
  • ruduce(function, sequence,[, initial]) -> value
  • 可迭代对象不能为空;初始值没提供就在可迭代对象中取一个元素

reduce方法举例

from functools import reduce

nums = [6, 5, 8, 5, 10, 6, 9, 4]
print(sum(nums)) # 53
print(reduce(lambda val, x: val + x,nums)) # 53

partial方法

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

partial方法举例1

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

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

print(newadd(7)) # 12
print(newadd(7,y=6)) # 13
print(newadd(y=9, x =5)) # 14
print(inspect.signature(newadd)) # (x, *, y=5) -> int 获取函数签名

partial方法举例2

  import functools
import inspect
def add(x, y, *args) -> int:
    # print(args) # 返回值为元组 (6, 5, 7) ;(6, 5, 7, 10);(6, 5)
    return x + y

newadd = functools.partial(add, 1,3,6,5)

print(newadd(7)) # 4
print(newadd(7, 10)) # 4
print(newadd(9, 10, y=20,x=26)) # 错误传参
print(newadd()) #4
print(inspect.signature(newadd)) # (*args) -> int

partial函数本质

def parial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords): # 包装函数
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*(args + fargs), **newkeywords)
    newfunc.func = func # 保留原函数
    newfunc.args = args # 保留原函数的位置参数
    newfunc.keywords = keywords #保留原函数的关键字参数
    return newfunc

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

foo = parial(add,4)
print(foo(5)) # 9

lre_cache方法

  • @functools.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) # 停止z秒
    return x + y

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

lru_cache装饰器

  • 通过一个字典缓存被装饰函数的调用和返回值
  • 斐波那契数列递归方法的改造
import functools

@functools.lru_cache() # maxsize=None
def fib(n):
    return 1 if n<3 else fib(n-1) + fib(n-2)

print([fib(i+1) for i in range(5)]) # [1, 1, 2, 3, 5]

lru_cache装饰器应用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值