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()

登录后复制

运行之后,完美~~

立即学习“Python免费学习笔记(深入)”;

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

import timedef 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、递归算法

递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

递归算法解决问题的特点:

(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

举个栗子:对一个数字进行除2求值,直到小于等于1时退出并输出结果

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.025.012.56.253.1251.5625the num is 6,val is 1.562500the num is 5,aa is 1.562500the num is 5,val is 3.125000the num is 4,aa is 3.125000the num is 4,val is 6.250000the num is 3,aa is 6.250000the num is 3,val is 12.500000the num is 2,aa is 12.500000the num is 2,val is 25.000000the num is 1,aa is 25.000000the 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.025.012.56.253.1251.5625the num is 6,val is 1.562500the num is 5,aa is 1.562500the num is 4,aa is 1.562500the num is 3,aa is 1.562500the num is 2,aa is 1.562500the 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 

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2535777.html

(0)
上一篇 2025年3月5日 23:06:44
下一篇 2025年3月5日 23:06:53

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 在Ubuntu系统下安装使用Python的GUI工具wxPython

    (一)wxpython的安装     Ubuntu下的安装,还是比较简单的。 #使用:apt-cache search wxpython 测试一下,可以看到相关信息dizzy@dizzy-pc:~/Python$ apt-cache sea…

    编程技术 2025年3月5日
    200
  • 玩转python爬虫之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧。那么这次为大家带来,python爬取糗事百科的小段子的例子。 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来。…

    2025年3月5日
    200
  • 以一个投票程序的实例来讲解Python的Django框架使用

    (一)关于django     Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 M…

    编程技术 2025年3月5日
    200
  • 玩转python爬虫之正则表达式

    面对大量杂乱的代码夹杂文字我们怎样把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 1.了解正则表达式 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,…

    2025年3月5日
    200
  • 使用Python生成随机密码的示例分享

    生成随机密码这件事情用python来干确实相当的方便,优美的string方法加上choice简直是绝配make_password.py ###简单几行代码执行即可生成记不住的字符串###$ python make_passwd.py DLr…

    编程技术 2025年3月5日
    200
  • 玩转python爬虫之URLError异常处理

    本节在这里主要说的是urlerror还有httperror,以及对它们的一些处理。 1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的服务器 服务器不存在 在代码中,我们需要用try…

    编程技术 2025年3月5日
    200
  • 玩转python爬虫之cookie使用方法

    之前一篇文章我们学习了爬虫的异常处理问题,那么接下来我们一起来看一下cookie的使用。 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密) 比如说有些…

    2025年3月5日
    200
  • 使用Python的PIL模块来进行图片对比

    在使用google或者baidu搜图的时候会发现有一个图片颜色选项,感觉非常有意思,有人可能会想这肯定是人为的去划分的,呵呵,有这种可能,但是估计人会累死, 开个玩笑,当然是通过机器识别的,海量的图片只有机器识别才能做到。 那用python…

    编程技术 2025年3月5日
    200
  • python编码最佳实践之总结

    相信用python的同学不少,本人也一直对python情有独钟,毫无疑问python作为一门解释性动态语言没有那些编译型语言高效,但是python简洁、易读以及可扩展性等特性使得它大受青睐。  工作中很多同事都在用python,但往往很少有…

    编程技术 2025年3月5日
    200
  • Python在Console下显示文本进度条的方法

    进度条实现原理 进度条和一般的print区别在哪里呢?答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过stdout输出的东西依旧保留,而且保证我们在下面看到最新的输出结果。进度条不然,我们必…

    编程技术 2025年3月5日
    200

发表回复

登录后才能评论