1、python装饰器

刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了。总结了一下解释得比较好的,通俗易懂的来说明一下:

小P闲来无事,随便翻看自己以前写的一些函数,忽然对一个最最最基础的函数起了兴趣:

  1. def sum1():
  2. sum = 1 + 2
  3. print(sum)
  4. sum1()

此时小P想看看这个函数执行用了多长时间,所以写了几句代码插进去了:

  1. import time
  2.  
  3. def sum1():
  4. start = time.clock()
  5. sum = 1+2
  6. print(sum)
  7. end = time.clock()
  8. print("time used:",end - start)
  9.  
  10. sum1()

运行之后,完美~~

可是随着继续翻看,小P对越来越多的函数感兴趣了,都想看下他们的运行时间如何,难道要一个一个的去改函数吗?当然不是!我们可以考虑重新定义一个函数timeit,将sum1的引用传递给他,然后在timeit中调用sum1并进行计时,这样,我们就达到了不改动sum1定义的目的,而且,不论小P看了多少个函数,我们都不用去修改函数定义了!

  1. import time
  2.  
  3. def sum1():
  4. sum = 1+ 2
  5. print (sum)
  6.  
  7. def timeit(func):
  8. start = time.clock()
  9. func()
  10. end =time.clock()
  11. print("time used:", end - start)
  12.  
  13. timeit(sum1)

咂一看,没啥问题,可以运行!但是还是修改了一部分代码,把sum1() 改成了timeit(sum1)。这样的话,如果sum1在N处都被调用了,你就不得不去修改这N处的代码。所以,我们就需要杨sum1()具有和timeit(sum1)一样的效果,于是将timeit赋值给sum1。可是timeit是有参数的,所以需要找个方法去统一参数,将timeit(sum1)的返回值(计算运行时间的函数)赋值给sum1。

  1. import time
  2.  
  3. def sum1():
  4. sum = 1+ 2
  5. print (sum)
  6.  
  7. def timeit(func):
  8. def test():
  9. start = time.clock()
  10. func()
  11. end =time.clock()
  12. print("time used:", end - start)
  13. return test
  14.  
  15. sum1 = timeit(sum1)
  16. sum1()

这样一个简易的装饰器就做好了,我们只需要在定义sum1以后调用sum1之前,加上sum1= timeit(sum1),就可以达到计时的目的,这也就是装饰器的概念,看起来像是sum1被timeit装饰了!Python于是提供了一个语法糖来降低字符输入量。

  1. import time
  2.  
  3. def timeit(func):
  4. def test():
  5. start = time.clock()
  6. func()
  7. end =time.clock()
  8. print("time used:", end - start)
  9. return test
  10.  
  11. @timeit
  12. def sum1():
  13. sum = 1+ 2
  14. print (sum)
  15.  
  16. sum1()

重点关注第11行的@timeit,在定义上加上这一行与另外写sum1 = timeit(sum1)完全等价。

2、递归算法

递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
 
举个栗子:对一个数字进行除2求值,直到小于等于1时退出并输出结果
  1. def divide(n,val):
  2. n += 1
  3. print(val)
  4. if val / 2 > 1:
  5. aa = divide(n,val/2)
  6. print('the num is %d,aa is %f' % (n,aa))
  7. print('the num is %d,val is %f' % (n,val))
  8. return(val)
  9.  
  10. divide(0,50.0)
  11.  
  12. 结果说明(不return时相当于嵌套循环,一层层进入在一层层退出):
  13. 50.0
  14. 25.0
  15. 12.5
  16. 6.25
  17. 3.125
  18. 1.5625
  19. the num is 6,val is 1.562500
  20. the num is 5,aa is 1.562500
  21. the num is 5,val is 3.125000
  22. the num is 4,aa is 3.125000
  23. the num is 4,val is 6.250000
  24. the num is 3,aa is 6.250000
  25. the num is 3,val is 12.500000
  26. the num is 2,aa is 12.500000
  27. the num is 2,val is 25.000000
  28. the num is 1,aa is 25.000000
  29. the num is 1,val is 50.000000
  30.  
  31. 2、递归时return
  32. def divide(n,val):
  33. n += 1
  34. print(val)
  35. if val / 2 > 1:
  36. aa = divide(n,val/2)
  37. print('the num is %d,aa is %f' % (n,aa))
  38. return(aa)
  39. print('the num is %d,val is %f' % (n,val))
  40. return(val)
  41.  
  42. divide(0,50.0)
  43.  
  44. 结果说明(return时就直接结束本次操作):
  45. 50.0
  46. 25.0
  47. 12.5
  48. 6.25
  49. 3.125
  50. 1.5625
  51. the num is 6,val is 1.562500
  52. the num is 5,aa is 1.562500
  53. the num is 4,aa is 1.562500
  54. the num is 3,aa is 1.562500
  55. the num is 2,aa is 1.562500
  56. the num is 1,aa is 1.562500

用递归实现斐波那契函数

  1. def feibo(first,second,stop,list):
  2.  
  3. if first >= stop or second >= stop:
  4. return list
  5. else:
  6. sum = first + second
  7. list.append(sum)
  8. if sum <= stop:
  9. return feibo(second,sum,stop,list)
  10.  
  11. return list
  12.  
  13. if __name__ == '__main__':
  14. first = int(raw_input('please input the first number:'))
  15. second = int(raw_input('please input the second number:'))
  16. stop = int(raw_input('please input the stop number:'))
  17. l = [first,second]
  18. a = feibo(first,second,stop,l)
  19. print(a)

3、简易计算器

  1. 该计算器思路:
  2. 1、递归寻找表达式中只含有 数字和运算符的表达式,并计算结果
  3. 2、由于整数计算会忽略小数,所有的数字都认为是浮点型操作,以此来保留小数

python装饰器通俗易懂的解释!的更多相关文章

  1. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  2. python装饰器方法

    前几天向几位新同事介绍项目,被问起了@login_required的实现,我说这是django框架提供的装饰器方法,验证用户是否登录,只要这样用就行了,因为自己不熟,并没有做过多解释. 今天查看dja ...

  3. python 装饰器 一篇就能讲清楚

    装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...

  4. 转发对python装饰器的理解

    [Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考   原文  http://blog.csdn.net/sxw3718401/article/details/3951958 ...

  5. Python装饰器的高级用法(翻译)

    原文地址 https://www.codementor.io/python/tutorial/advanced-use-python-decorators-class-function 介绍 我写这篇 ...

  6. 你必须学写 Python 装饰器的五个理由

    你必须学写Python装饰器的五个理由 ----装饰器能对你所写的代码产生极大的正面作用 作者:Aaron Maxwell,2016年5月5日 Python装饰器是很容易使用的.任何一个会写Pytho ...

  7. 一个关于python装饰器参数的问题

    看到廖雪峰python教程上,python装饰器一章 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3 ...

  8. 装饰模式和python装饰器

    装饰器和装饰模式 先给出两者的定义: - 装饰器:装饰器是一个非常著名的设计模式,常常被用于有切面需求的场景.较为经典的有插入日志.性能測试.事务处理等. 装饰器是解决这类问题的绝佳设计.有了装饰器, ...

  9. Python装饰器完全解读

    1 引言 装饰器(Decorators)可能是Python中最难掌握的概念之一了,也是最具Pythonic特色的技巧,深入理解并应用装饰器,你会更加感慨——人生苦短,我用Python. 2 初步理解装 ...

随机推荐

  1. java并发编程(九)死锁

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17200937 大部分代码并不容易产生死锁,死锁可能在代码中隐藏相当长的时间,等待不常见的条 ...

  2. Hibernate主键生成策略(转)

    1.自动增长identity 适用于MySQL.DB2.MS SQL  Server,采用数据库生成的主键,用于为long.short.int类型生成唯一标识 使用SQL Server 和 MySQL ...

  3. Unity字节序问题

    问题 Unity中有些配置信息并不想在发布之后给其他人看到,所以在打包的时候进行了简单的编码处理,然后保存为.bytes类型,读取的时候再进行解码处理.今天遇到的很奇葩的问题是: 如果bytes文件U ...

  4. “菜”鸟理解.NET Framework(CLI,CLR,CTS,CLS,BCL,FCL)

    既然要学.NET,就要先认识认识她,我不喜欢大段大段文字的东西,自己通过理解,画个图,来看看.NET的沉鱼落雁,闭月羞花之容. 最下层蓝色部分是.NET Framework的基础,也是所有应用软件的基 ...

  5. Notif

    <?php/** * 支付宝通知接口 * @author YinKu.Alan * @date 2016-03-06 */class NotifyAction extends CommonAct ...

  6. SQL TOP 子句、SQL LIKE 操作符、SQL 通配符

    TOP 子句 TOP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的. 注释:并非所有的数据库系统都支持 TOP 子句. SQL Server 的语法: S ...

  7. Runtime详解

    http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/

  8. [转载]Ubuntu17.04(Zesty Zapus)路线图发布:2017年4月13日发布

    Canonical今天公布了Ubuntu 17.04(Zesty Zapus)操作系统的发布路线图,该版本于今年10月24日上线启动,toolchain已经上传且首个daily ISO镜像已经生成.面 ...

  9. nvm诡异的报错

    安装:curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.0/install.sh | bash wget -qO- htt ...

  10. 手机QQ内置网页,微信内置网页中进行分享到QQ和微信的操作

    微信内的网页分享: API内容详见微信开发文档  https://mp.weixin.qq.com/wiki 这里需要注意的是:调用微信API的时候修改的是微信内网页右上角三个点那里打开后,选择分享之 ...