Python入门篇-functools

                                      作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.partial方法

1>.partial概述

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

2>.partial方法举例

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6
 7
 8 import functools,inspect
 9
10 def add(x, y, *args) -> int:
11     print("add args:{}".format(args))
12     return x + y
13
14 newadd = functools.partial(add, y=5)
15
16 print(inspect.signature(add))
17 print(newadd(7))
18 print(newadd(10, y=20))
19 print(newadd(y=10, x=6))
20 print(inspect.signature(newadd))
21
22
23
24 #以上代码执行结果如下:
25 (x, y, *args) -> int
26 add args:()
27 12
28 add args:()
29 30
30 add args:()
31 16
32 (x, *, y=5) -> int

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6
 7
 8 import functools,inspect
 9
10 def add(x, y, *args) -> int:
11     print("add args:{}".format(args))
12     return x + y
13
14 newadd = functools.partial(add, 1,3,6,5)
15 print(newadd(7))
16 print(newadd(7, 10))
17 print(newadd())
18 print(inspect.signature(add))
19 print(inspect.signature(newadd))
20
21
22
23 #以上代码执行结果如下:
24 add args:(6, 5, 7)
25 4
26 add args:(6, 5, 7, 10)
27 4
28 add args:(6, 5)
29 4
30 (x, y, *args) -> int
31 (*args) -> int

partial方法举例

3>.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 = keywords # 保留原函数的关键字参数参数return newfunc

def add(x,y):return x+y
foo = partial(add,4)
foo(5)

二.lru_cache方法

1>.lru_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)将被视为具有不同结果的不同调用

2>. lru_cache举例

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6
 7
 8 import functools
 9 import time
10
11 @functools.lru_cache()
12 def add(x, y, z=3):
13     time.sleep(z)
14     return x + y
15
16 print(add(4, 5))
17 print(add(4.0, 5))
18 print(add(4, 6))
19 print(add(4, 6, 3))
20 print(add(3, 2))
21 print(add(2, y=3))
22 print(add(x=40, y=60))
23 print(add(y=60, x=40))

3>.lru_cache装饰器

  通过一个字典缓存被装饰函数的调用和返回值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(tuple(),{'z':3,'x':4,'y':6}, True)

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6
 7
 8 import functools
 9
10 @functools.lru_cache() # maxsize=None
11 def fib(n):
12     if n < 3:
13         return n
14     return fib(n-1) + fib(n-2)
15
16 print([fib(x) for x in range(35)])
17
18
19
20
21 #以上代码执行结果如下:
22 [0, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465]

斐波那契数列递归方法的改造

4>.lru_cache装饰器应用

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

三.装饰器应用练习

1>.实现一个cache装饰器,实现可过期被清除的功能

  简化设计,函数的形参定义不包含可变位置参数、可变关键词参数和keyword-only参数  可以不考虑缓存满了之后的换出问题

2>.写一个命令分发器

  程序员可以方便的注册函数到某一个命令,用户输入命令时,路由到注册的函数如果此命令没有对应的注册函数,执行默认函数
  用户输入用input(">>")

转载于:https://www.cnblogs.com/yinzhengjie/p/10976621.html

Python入门篇-functools相关推荐

  1. python functools_Python入门篇-functools

    Python入门篇-functools 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.reduce方法 reduce方法,顾名思义就是减少 reduce(function,se ...

  2. Python入门篇-匿名函数

    Python入门篇-匿名函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.匿名函数概述 1>.什么是匿名函数 匿名,即没有名字 匿名函数,即没有名字的函数 2>. ...

  3. Python入门篇-数据结构堆排序Heap Sort

    Python入门篇-数据结构堆排序Heap Sort 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.堆Heap 堆是一个完全二叉树每个非叶子结点都要大于或者等于其左右孩子结点的 ...

  4. Python入门篇-高级数据类型集合(set)和字典(dict)

    Python入门篇-高级数据类型集合(set)和字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.集合(set) 1>.集合的特点 约定set 翻译为集合c ...

  5. Python入门篇-生成器函数

    Python入门篇-生成器函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.生成器概述 1>.生成器generator 生成器指的是生成器对象,可以由生成器表达式得到, ...

  6. 编程小白学python知乎周刊_在知乎上学 Python - 入门篇

    写在前面 本文对知乎上关于Python入门方面的问答.文章.专栏做了一定的收集和整理,希望对各位Python学习者能有帮助,至少可以节省大家一点时间. 这一篇主要针对的是零基础或初学Python,包括 ...

  7. 学习python(入门篇)

    俺这里想给大家初步介绍一下Python编程. 各位能看英文的, 最好是去看www.python.org上的其原作者Guido van Rossum 的入门介绍. (Python看成自1.6版以后就能处 ...

  8. Python 入门篇-最新版python3.7.2的安装。

    Python的获取: 方式一:Python官方网站获取 方式二:小蓝枣的资源仓库,提取码:ru99 官网下的可能有点慢,可以在我的资源仓库获取. 说明: 这里的64不是指通常的64位,虽然我的操作系统 ...

  9. Python 入门篇-用Notepad++编写出第一个python程序

    首先我们要安装Notepad++ Notepad++获取方式如下: 官网获取 小蓝枣的资源仓库获取,提取码:cu89 安装简单,选择简体中文安装就好了,中间会有个配置安装路径,想改的话可以改. 接下来 ...

最新文章

  1. 招银网络笔试java_2020招银网络科技校园招聘常见问题
  2. python gui 可视化开发工具_python开发的gui漂亮吗
  3. 在Eclipse中高效运行HTTP / REST集成测试
  4. php 上传文件简单实例,php文件上传的简单实例
  5. 不写程序,整体就泡 土豆网电视剧
  6. 解决Eclipse编译web项目失败问题
  7. 是什么让你萌发了跳槽的念头?
  8. vue typeScript get set 用法
  9. python控制excel打印_python对excel表格的操作
  10. deepin关机卡桌面_有了MyDock,我也有了一个MacBook桌面
  11. 无卷积结构(那就纯ransformer)的参考图像分割:ReSTR: Convolution-free Referring Image Segmentation Using Transformers
  12. 港股通不得不了解的汇率问题
  13. 在线网校教育平台的开发,题库的搭建必不可少
  14. 【误差】方差、标准差、均方误差和均方根误差的区别总结
  15. System.Web.Caching.Cache
  16. iOS 中集成百度echarts3.0
  17. App开发者必备的运营原型UI设计工具整理
  18. UG12.0绿色版(可选中文)安装教程
  19. Go 语言编程 — GPM 与 CSP 高并发模型
  20. 【AI测试】也许这有你想知道的人工智能 (AI) 测试--第二篇

热门文章

  1. 英特尔CPU机密数据大量泄露:芯片后门实锤,下一代CPU原理图曝光
  2. 清华姚班2019级新生来了:高考状元、奥赛金牌,也是一批被AI感召的00后
  3. idea搭建javaweb项目 Artifacts生成
  4. eventEmitter3源码分析与学习
  5. python 正则分析nginx日志
  6. 5款非常好用的前端在线编辑器推荐
  7. 1.5 Activity08 RadioButton
  8. 福师计算机导论在线作业一,福师《计算机导论》在线作业一..doc
  9. python coding_python开头的coding设置方法
  10. AWS — AWS Wavelength