python装饰器通俗易懂的解释!
1、python装饰器
刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了。总结了一下解释得比较好的,通俗易懂的来说明一下:
小P闲来无事,随便翻看自己以前写的一些函数,忽然对一个最最最基础的函数起了兴趣:
- def sum1():
- sum = 1 + 2
- print(sum)
- sum1()
此时小P想看看这个函数执行用了多长时间,所以写了几句代码插进去了:
- import time
- def sum1():
- start = time.clock()
- sum = 1+2
- print(sum)
- end = time.clock()
- print("time used:",end - start)
- sum1()
运行之后,完美~~
可是随着继续翻看,小P对越来越多的函数感兴趣了,都想看下他们的运行时间如何,难道要一个一个的去改函数吗?当然不是!我们可以考虑重新定义一个函数timeit,将sum1的引用传递给他,然后在timeit中调用sum1并进行计时,这样,我们就达到了不改动sum1定义的目的,而且,不论小P看了多少个函数,我们都不用去修改函数定义了!
- import time
- def sum1():
- sum = 1+ 2
- print (sum)
- def timeit(func):
- start = time.clock()
- func()
- end =time.clock()
- print("time used:", end - start)
- timeit(sum1)
咂一看,没啥问题,可以运行!但是还是修改了一部分代码,把sum1() 改成了timeit(sum1)。这样的话,如果sum1在N处都被调用了,你就不得不去修改这N处的代码。所以,我们就需要杨sum1()具有和timeit(sum1)一样的效果,于是将timeit赋值给sum1。可是timeit是有参数的,所以需要找个方法去统一参数,将timeit(sum1)的返回值(计算运行时间的函数)赋值给sum1。
- import time
- def sum1():
- sum = 1+ 2
- print (sum)
- def timeit(func):
- def test():
- start = time.clock()
- func()
- end =time.clock()
- print("time used:", end - start)
- return test
- sum1 = timeit(sum1)
- sum1()
这样一个简易的装饰器就做好了,我们只需要在定义sum1以后调用sum1之前,加上sum1= timeit(sum1),就可以达到计时的目的,这也就是装饰器的概念,看起来像是sum1被timeit装饰了!Python于是提供了一个语法糖来降低字符输入量。
- import time
- def timeit(func):
- def test():
- start = time.clock()
- func()
- end =time.clock()
- print("time used:", end - start)
- return test
- @timeit
- def sum1():
- sum = 1+ 2
- print (sum)
- sum1()
重点关注第11行的@timeit,在定义上加上这一行与另外写sum1 = timeit(sum1)完全等价。
2、递归算法
- def divide(n,val):
- n += 1
- print(val)
- if val / 2 > 1:
- aa = divide(n,val/2)
- print('the num is %d,aa is %f' % (n,aa))
- print('the num is %d,val is %f' % (n,val))
- return(val)
- divide(0,50.0)
- 结果说明(不return时相当于嵌套循环,一层层进入在一层层退出):
- 50.0
- 25.0
- 12.5
- 6.25
- 3.125
- 1.5625
- the num is 6,val is 1.562500
- the num is 5,aa is 1.562500
- the num is 5,val is 3.125000
- the num is 4,aa is 3.125000
- the num is 4,val is 6.250000
- the num is 3,aa is 6.250000
- the num is 3,val is 12.500000
- the num is 2,aa is 12.500000
- the num is 2,val is 25.000000
- the num is 1,aa is 25.000000
- the num is 1,val is 50.000000
- 2、递归时return:
- def divide(n,val):
- n += 1
- print(val)
- if val / 2 > 1:
- aa = divide(n,val/2)
- print('the num is %d,aa is %f' % (n,aa))
- return(aa)
- print('the num is %d,val is %f' % (n,val))
- return(val)
- divide(0,50.0)
- 结果说明(return时就直接结束本次操作):
- 50.0
- 25.0
- 12.5
- 6.25
- 3.125
- 1.5625
- the num is 6,val is 1.562500
- the num is 5,aa is 1.562500
- the num is 4,aa is 1.562500
- the num is 3,aa is 1.562500
- the num is 2,aa is 1.562500
- the num is 1,aa is 1.562500
用递归实现斐波那契函数
- def feibo(first,second,stop,list):
- if first >= stop or second >= stop:
- return list
- else:
- sum = first + second
- list.append(sum)
- if sum <= stop:
- return feibo(second,sum,stop,list)
- return list
- if __name__ == '__main__':
- first = int(raw_input('please input the first number:'))
- second = int(raw_input('please input the second number:'))
- stop = int(raw_input('please input the stop number:'))
- l = [first,second]
- a = feibo(first,second,stop,l)
- print(a)
3、简易计算器
- 该计算器思路:
- 1、递归寻找表达式中只含有 数字和运算符的表达式,并计算结果
- 2、由于整数计算会忽略小数,所有的数字都认为是浮点型操作,以此来保留小数
python装饰器通俗易懂的解释!的更多相关文章
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- python装饰器方法
前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...
- python 装饰器 一篇就能讲清楚
装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...
- 转发对python装饰器的理解
[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文 http://blog.csdn.net/sxw3718401/article/details/3951958 ...
- Python装饰器的高级用法(翻译)
原文地址 https://www.codementor.io/python/tutorial/advanced-use-python-decorators-class-function 介绍 我写这篇 ...
- 你必须学写 Python 装饰器的五个理由
你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...
- 一个关于python装饰器参数的问题
看到廖雪峰python教程上,python装饰器一章 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3 ...
- 装饰模式和python装饰器
装饰器和装饰模式 先给出两者的定义: - 装饰器:装饰器是一个非常著名的设计模式,常常被用于有切面需求的场景.较为经典的有插入日志.性能測试.事务处理等. 装饰器是解决这类问题的绝佳设计.有了装饰器, ...
- Python装饰器完全解读
1 引言 装饰器(Decorators)可能是Python中最难掌握的概念之一了,也是最具Pythonic特色的技巧,深入理解并应用装饰器,你会更加感慨——人生苦短,我用Python. 2 初步理解装 ...
随机推荐
- java并发编程(九)死锁
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17200937 大部分代码并不容易产生死锁,死锁可能在代码中隐藏相当长的时间,等待不常见的条 ...
- Hibernate主键生成策略(转)
1.自动增长identity 适用于MySQL.DB2.MS SQL Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL ...
- Unity字节序问题
问题 Unity中有些配置信息并不想在发布之后给其他人看到,所以在打包的时候进行了简单的编码处理,然后保存为.bytes类型,读取的时候再进行解码处理.今天遇到的很奇葩的问题是: 如果bytes文件U ...
- “菜”鸟理解.NET Framework(CLI,CLR,CTS,CLS,BCL,FCL)
既然要学.NET,就要先认识认识她,我不喜欢大段大段文字的东西,自己通过理解,画个图,来看看.NET的沉鱼落雁,闭月羞花之容. 最下层蓝色部分是.NET Framework的基础,也是所有应用软件的基 ...
- Notif
<?php/** * 支付宝通知接口 * @author YinKu.Alan * @date 2016-03-06 */class NotifyAction extends CommonAct ...
- SQL TOP 子句、SQL LIKE 操作符、SQL 通配符
TOP 子句 TOP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的. 注释:并非所有的数据库系统都支持 TOP 子句. SQL Server 的语法: S ...
- Runtime详解
http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/
- [转载]Ubuntu17.04(Zesty Zapus)路线图发布:2017年4月13日发布
Canonical今天公布了Ubuntu 17.04(Zesty Zapus)操作系统的发布路线图,该版本于今年10月24日上线启动,toolchain已经上传且首个daily ISO镜像已经生成.面 ...
- nvm诡异的报错
安装:curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash wget -qO- htt ...
- 手机QQ内置网页,微信内置网页中进行分享到QQ和微信的操作
微信内的网页分享: API内容详见微信开发文档 https://mp.weixin.qq.com/wiki 这里需要注意的是:调用微信API的时候修改的是微信内网页右上角三个点那里打开后,选择分享之 ...