functools模块

reduce

functools.reduce(function, sequence[, initial]) -> value

就是减少的意思

初始值没提供就在可迭代对象中取一个

from functools importreduceprint(sum(range(10),100))print(reduce(lambda x,y:x+y,range(10),100))#输出都是 145

from functools importreduce

reduce(lambda x,y:x*y,range(1,5)) #求阶乘

上一次lambda函数的返回值会成为下一次的x

partial(偏函数)

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

函数本质:

def partial(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=keywordsreturn newfunc

示例:

from functools importpartialimportinspectdefadd(x,y):return x +y

newadd= partial(add,y=10) #相当于固定了y这个参数,y必须通过keyword关键字传参

newadd(4),newadd(x=4),newadd(y=10,x=10),newadd(x=10,y=11),newadd(4,y=5) #y

#输出 (14, 14, 20, 21, 9)

inspect.signature(newadd)#

newadd(4,5) 错误的本质在于,它等价于 newadd(4,5,y=10) y值拿到了两个值,此处y则不能通过位置传参

def add(x,y,*args):return x + y +sum(args)

newadd= partial(add,1,2,3,4,5)

inspect.signature(newadd)# #签名是可变位置参数,则说明不能使用keyword传参

newadd(),newadd(10),newadd(3,4),newadd(3,4,5)#(15, 25, 22, 27)

#newadd(x=1,y=1) 错误写法,不能使用keyword传参

defadd(x,y):return x +y

newadd= partial(add,x=10,y=20)

inspect.signature(newadd)#

newadd(),newadd(x=20,y=10)#(30, 30)

lru_cache

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

lru表示最近最少使用,cache缓存

如果maxsize设置为None,则禁用LRU功能,并且缓存可以无限制的增长,maxsize是2的幂,LRU功能执行的最好

如果typed设置为True,则不同类型的函数参数将单独的缓存,例如,f(3),f(3.0)将被视为具有不同结果的不同调用

Python3.8简化了函数调用

importfunctools

@functools.lru_cachedefadd(x,y):pass

#等价于

importfunctools

@functools.lru_cache(maxsize=128)defadd(x,y):pass

示例:

importtimeimportfunctools

@functools.lru_cache()defadd(x,y):

time.sleep(3)print('-' * 20)return x +yprint(add(4,5))print(add(4,5))print(add(4.0,5))print(add(4,y=5))print(add(x=4,y=5))print(add(y=5,x=4))#前三种都视为同一种,会被缓存命中,后三种则不能被命中#输出

--------------------

9

9

9

--------------------

9

--------------------

9

--------------------

9

应用

lru_cache装饰器的应用,求斐波那契数列的值

importfunctools

@functools.lru_cache()def fib(n,a=0,b=1):return 1 if n < 3 else fib(n-1) + fib(n-2)

fib(101)573147844013817084101

###############################

from functools importlru_cache

@lru_cache()def fib(n,a=0,b=1):return 1 if n < 3 else fib(n-1) + fib(n-2)

fib(101)573147844013817084101

总结

lru_cache装饰器应用

使用前提:

同样的函数参数一定得得到同样的结果,至少是一段时间内,同样的输入得到同样的结果

计算代价高,函数执行时间过长

需要多次执行,每次计算的结果一样

缺点:

不支持过期缓存清理,key无法过期,失效

不支持清理

不支持分布式,是一个单机的缓存

适用场景:单机上需要空间换时间的地方,可以用缓存来将计算编程快速查询

python functools.reduce_Python-functools模块(reduce、partial、lru_cache)相关推荐

  1. Python 标准库 functools 模块详解

    functools 官方文档:https://docs.python.org/zh-cn/3/library/functools.html Python 标准模块 --- functools:http ...

  2. python functools.wraps functools.partial实例解析

    一:python functools.wraps 实例 1. 未使用wraps的实例 #!/usr/bin/env python # coding:utf-8def logged(func):def ...

  3. python functools partial_浅谈python标准库--functools.partial

    一.简单介绍: functools模块用于高阶函数:作用于或返回其他函数的函数.一般而言,任何可调用对象都可以作为本模块用途的函数来处理. functools.partial返回的是一个可调用的par ...

  4. Python入门篇-functools

    Python入门篇-functools 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.partial方法 1>.partial概述 偏函数,把函数部分的参数固定下来,相当 ...

  5. python装饰器functools

    #!/usr/bin/python3import functools# 装饰器 def wrapper(func):@functools.wraps(func)def inner(*args, **k ...

  6. Python标准库asyncio模块基本原理浅析

    Python标准库asyncio模块基本原理浅析 本文环境python3.7.0 asyncio模块的实现思路 当前编程语言都开始在语言层面上,开始简化对异步程序的编程过程,其中Python中也开始了 ...

  7. python高阶函数map_简单了解python高阶函数map/reduce

    高阶函数map/reduce Python内建了map()和reduce()函数. 我们先看map.map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每 ...

  8. Python高级——正则表达式 re模块1.match方法

    python:正则表达式 一.什么是正则表达式 正则表达式也叫做匹配模式(Pattern),它由一组具有特定含义的字符串组成,通常用于匹配和替换文本. 正则表达式,是一个独立的技术,很多编程语言支持正 ...

  9. Python实战之logging模块使用详解

    用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所 ...

最新文章

  1. [PHP] 访问MySQL
  2. python3.8.5怎么用-python3.8 五分钟就可以入门
  3. [轉]c#从Excel中读取图片
  4. Mac的控制台命令无法使用command not found
  5. cad动态块制作翻转_装X必学,手把手教你做CAD动态属性块
  6. 刚刚,Redis公布了5.0版本12项新特性
  7. oracle dba角色_DBA在“即服务”世界中角色的不断变化
  8. EIGRP passive-interface
  9. 解决dephi使用Word时出现“没有注册接口”的情况。
  10. 微波雷达存在感应模组,智能微波感应开关,多普勒雷达原理应用
  11. 一种MOS场效应管H桥电机驱动电路
  12. 【评测】Alfa Aesar分子砌块
  13. 牛客假日团队赛31 A Mowing the Lawn (单调队列维护dp)
  14. thinkphp3.2读取Excel文件
  15. Android Studio中模拟器如何输入中文、将模拟器语言设置为中文
  16. 2.5G 电口网络应用,拭目以待
  17. :-1: error: [debug/qrc_image.cpp] Error 1
  18. 无限法则服务器选择吗,PlayStation 4内置存储空间不够?可使用移动固态硬盘外置拓展...
  19. 全宇宙尺寸最小的OpenMV!OpenMV Mini!
  20. 【STM32H7】第5章 RTX5操作系统移植(MDK AC6)

热门文章

  1. python随机补边缘border
  2. Android studio自定义变量
  3. netstat -ano
  4. Nginx文件描述符泄露?浅析FD_CLOEXEC文件描述符标志
  5. 十五、Redis三种特殊类型之二HyperLoglog
  6. java中pc寄存器的作用是什么_既然有PC寄存器,栈帧里的返回地址的作用是什么?...
  7. python怎么添加csv模式_python对csv文件追加写入列的方法
  8. elasticsearch扩展ik分词器词库
  9. linux 批量替换所有文件中包含的字符串
  10. note js 创建项目_vue.js使用vuecli3快速创建项目