python functools.reduce_Python-functools模块(reduce、partial、lru_cache)
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)相关推荐
- Python 标准库 functools 模块详解
functools 官方文档:https://docs.python.org/zh-cn/3/library/functools.html Python 标准模块 --- functools:http ...
- python functools.wraps functools.partial实例解析
一:python functools.wraps 实例 1. 未使用wraps的实例 #!/usr/bin/env python # coding:utf-8def logged(func):def ...
- python functools partial_浅谈python标准库--functools.partial
一.简单介绍: functools模块用于高阶函数:作用于或返回其他函数的函数.一般而言,任何可调用对象都可以作为本模块用途的函数来处理. functools.partial返回的是一个可调用的par ...
- Python入门篇-functools
Python入门篇-functools 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.partial方法 1>.partial概述 偏函数,把函数部分的参数固定下来,相当 ...
- python装饰器functools
#!/usr/bin/python3import functools# 装饰器 def wrapper(func):@functools.wraps(func)def inner(*args, **k ...
- Python标准库asyncio模块基本原理浅析
Python标准库asyncio模块基本原理浅析 本文环境python3.7.0 asyncio模块的实现思路 当前编程语言都开始在语言层面上,开始简化对异步程序的编程过程,其中Python中也开始了 ...
- python高阶函数map_简单了解python高阶函数map/reduce
高阶函数map/reduce Python内建了map()和reduce()函数. 我们先看map.map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每 ...
- Python高级——正则表达式 re模块1.match方法
python:正则表达式 一.什么是正则表达式 正则表达式也叫做匹配模式(Pattern),它由一组具有特定含义的字符串组成,通常用于匹配和替换文本. 正则表达式,是一个独立的技术,很多编程语言支持正 ...
- Python实战之logging模块使用详解
用Python写代码的时候,在想看的地方写个print xx 就能在控制台上显示打印信息,这样子就能知道它是什么了,但是当我需要看大量的地方或者在一个文件中查看的时候,这时候print就不大方便了,所 ...
最新文章
- [PHP] 访问MySQL
- python3.8.5怎么用-python3.8 五分钟就可以入门
- [轉]c#从Excel中读取图片
- Mac的控制台命令无法使用command not found
- cad动态块制作翻转_装X必学,手把手教你做CAD动态属性块
- 刚刚,Redis公布了5.0版本12项新特性
- oracle dba角色_DBA在“即服务”世界中角色的不断变化
- EIGRP passive-interface
- 解决dephi使用Word时出现“没有注册接口”的情况。
- 微波雷达存在感应模组,智能微波感应开关,多普勒雷达原理应用
- 一种MOS场效应管H桥电机驱动电路
- 【评测】Alfa Aesar分子砌块
- 牛客假日团队赛31 A Mowing the Lawn (单调队列维护dp)
- thinkphp3.2读取Excel文件
- Android Studio中模拟器如何输入中文、将模拟器语言设置为中文
- 2.5G 电口网络应用,拭目以待
- :-1: error: [debug/qrc_image.cpp] Error 1
- 无限法则服务器选择吗,PlayStation 4内置存储空间不够?可使用移动固态硬盘外置拓展...
- 全宇宙尺寸最小的OpenMV!OpenMV Mini!
- 【STM32H7】第5章 RTX5操作系统移植(MDK AC6)
热门文章
- python随机补边缘border
- Android studio自定义变量
- netstat -ano
- Nginx文件描述符泄露?浅析FD_CLOEXEC文件描述符标志
- 十五、Redis三种特殊类型之二HyperLoglog
- java中pc寄存器的作用是什么_既然有PC寄存器,栈帧里的返回地址的作用是什么?...
- python怎么添加csv模式_python对csv文件追加写入列的方法
- elasticsearch扩展ik分词器词库
- linux 批量替换所有文件中包含的字符串
- note js 创建项目_vue.js使用vuecli3快速创建项目