python基础一 ------装饰器的作用
装饰器:
本质属性:为函数增加新功能的函数,只是有个语法糖,显得高大上而已
#装饰器
#引子 计算斐波那契数列,第50 项
import time
def fibonacci(num):
if num<=1:
return 1
else:
return fibonacci(num-1)+fibonacci(num-2)
start = time.time()
print(fibonacci(35))
end = time.time()
print(end-start)
print("-----------------------------分割线1-------------")
'''
结果:14930352
5.807300329208374
'''
#计算浪费了好多的时间,比如计算9,等于7+8项,再计算第7和8 第七=5+6;第八=7+6 重复计算了第七和第6
#改进,增加cache
def fibonacci(num,cache={}): if num<=1:
cache[num] = 1 return 1
else:
if num in cache.values():
return cache[num]
result = fibonacci(num-1,cache)+fibonacci(num-2,cache)
cache[num] = result
return result
start = time.time()
print(fibonacci(35))
end = time.time()
print(end-start)
'''
改进结果:
14930352
6.50729775428772
-----------------------------分割线2-------------
14930352
0.19814443588256836
'''
#引子2——台阶问题:一共10个台阶的楼梯,从下去上,一次迈1-3个台阶,
#不能后退,走完这个楼梯有多少走法
def climb(num,steps):
count = 0
if num==0:
count= 1
elif num>0:
for step in steps:
count += count(num-strp,steps)
return count
@memo
def climb_2(num,steps):
count = 0
if num==0:
count= 1
elif num>0:
for step in steps:
count += count(num-strp,steps)
return count
#此时,当num过大时,同样进行了重复的计算,比如100个台阶,当从第一个迈1个到达的50
#还是第一个迈2个到达的50 此后的计算都是重复的
'''
当多个函数都用到了相同的方法来增加函数的功能时,即将函数中相同的功能抽象出来,
即可得到一个新的函数,这个函数用来修饰其他的函数,即这个函数就是装饰器
''' def memo(func):
cache ={} #每次执行内函数时,cache还会在内存中,此时是闭包
def wrap(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrap
#使用装饰器: fibonacci_2 = memo(fibonacci_2)
@memo
def fibonacci_2(num):
if num<=1:
return 1
else:
return fibonacci(num-1)+fibonacci(num-2)
start = time.time()
print(fibonacci_2(35))
end = time.time()
print(end-start)
print("-----------------------------分割线3-------------")
python基础一 ------装饰器的作用的更多相关文章
- python基础—函数装饰器
python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...
- 十. Python基础(10)--装饰器
十. Python基础(10)--装饰器 1 ● 装饰器 A decorator is a function that take a function as an argument and retur ...
- python基础之 装饰器,内置函数
1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使用外部变量(非全局变量)叫做闭包! def wrapper(): money =10 def inner(num) ...
- Day11 Python基础之装饰器(高级函数)(九)
在python中,装饰器.生成器和迭代器是特别重要的高级函数 https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...
- 1.16 Python基础知识 - 装饰器初识
Python中的装饰器就是函数,作用就是包装其他函数,为他们起到修饰作用.在不修改源代码的情况下,为这些函数额外添加一些功能,像日志记录,性能测试等.一个函数可以使用多个装饰器,产生的结果与装饰器的位 ...
- python基础--定义装饰器(内置装饰器)
装饰器的定义: 装饰器本质上就是一个python函数,它可以让其它函数在不需要做任何代码改动的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景中,比如-- >插入 ...
- [python基础]关于装饰器
在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...
- 【Python基础】装饰器的解释和用法
装饰器的用法比较简单,但是理解装饰器的原理还是比较复杂的,考虑到接下来的爬虫框架中很多用到装饰器的地方,我们先来讲解一下. 函数 我们定义了一个函数,没有什么具体操作,只是返回一个固定值 请注意一下缩 ...
- python基础-----函数/装饰器
函数 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. 函数的优点之一是,可以将代码块与主程 ...
随机推荐
- eclipse创建动态maven项目
需求表均同springmvc案例 此处只是使用maven 注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装m ...
- selenium 无法启动IE
解决办法是IE选项设置的安全页中,4个区域的启用保护模式的勾选都去掉(或都勾上)
- Selenium+PhantomJS使用时报错原因及解决方案
问题 今天在使用selenium+PhantomJS动态抓取网页时,出现如下报错信息: UserWarning: Selenium support for PhantomJS has been dep ...
- RazorEngine.Templating MVC中View当模板
最近在做一个生成JSON的功能,比较笨的办法就是把需要的数据拆分开,保存到数据库,在从数据库中取出来进行拼接.这种方法比较笨,代码就不贴了. 需要注意拼接的时的转义字符: "\"s ...
- 拒绝频繁IP访问--转载
//首先我们要实现 IHttpModule接口 using System; using System.Collections.Generic; using System.Text; using Sys ...
- UTC时间戳转为时间
/// <summary> /// 将UTC时间转化DateTime时间 /// </summary> /// <returns></returns> ...
- IT设备服务监控的方法论
有方法论提导,在技战术方面才不会偏离目录. 使用服务级别作为关键语,召示着承诺和责任. https://www.circonus.com/2018/06/comprehensive-container ...
- shell 写的 jrottenberg/ffmpeg 转码
#!/bin/bash ];then echo "The argument must be 2" exit; else echo "$1 $2" fi VIDE ...
- FormsAuthenticationTicket
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- P4714 「数学」约数个数和
题解: 会了Miller-Rabin这题就很简单了 首先这种题很容易想到质因数分解 但是暴力根号算法是不行的 所以要用到 Miller-Rabin素数 https://blog.csdn.net/lt ...