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语句返回. 函数的优点之一是,可以将代码块与主程 ...
随机推荐
- 编程语言,执行python程序,变量(命名规范)
编程语言 分类: 计算语言/汇编语言/高级语言 计算语言: 站在计算机的角度,说计算机能听懂的语言,就是直接用二进制编程,直接操作硬件 优点是最底层,执行速度最快 缺点是最复杂,开发效率最低 ...
- 使用powerdesigner导入sql脚本,生成物理模型
有些时候我们的powerdesigner以jdbc的形式链接本地数据库可能会失败,这时候我觉得从sql文件中生成物理模型是个很不错的方法 1.打开powerdesigner,文件->->r ...
- SQL Server索引维护
索引维护的两个重要方面是索引碎片和统计信息. 一:索引碎片 降低碎片的产生,当索引上的页不在具有物理连续性时,就会产生碎片,下面的情景会产生碎片: INSERT操作.UPDATE操作.DBCC SHR ...
- 【C++ Primer | 15】继承的构造函数
继承的构造函数 子类为完成基类初始化,在C++11之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递.如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数. cl ...
- 在 Windows服务器中启用/禁用SMBv1、SMBv2和SMBv3的方法
本文介绍如何在 SMB 客户端和服务器组件上启用/禁用服务器消息块 SMBv1.SMBv2 和 SMBv3. 注意:建议由专业技术工程师完成以下操作. 禁用 SMBv2 和 SMBv3 的影响 我们建 ...
- 一脸懵逼学习Zookeeper(动物园管理员)---》高度可靠的分布式协调服务
1:Zookeeper是一个分布式协调服务:就是为用户的分布式应用程序提供协调服务 A.zookeeper是为别的分布式程序服务的 B.Zookeeper本身就是一个分布式程序(只要有半数以上节点存活 ...
- [转] mongodb下载、安装、配置与使用
记得在管理员模式下运行CMD,否则服务将启动失败. 详细图解,记录 win7 64 安装mongo数据库的过程.安装的版本是 MongoDB-win32-x86_64-2008plus-ssl-3.4 ...
- .net core vs2015 vs2017打开后errpr
需要将每个项目中增加global.json 并设置sdk的版本,注意,每个类库中均需增加. { "sdk": { "version": "1.0.0 ...
- 跳跃表Skip List的原理
1.二分查找和AVL树查找 二分查找要求元素可以随机访问,所以决定了需要把元素存储在连续内存.这样查找确实很快,但是插入和删除元素的时候,为了保证元素的有序性,就需要大量的移动元素了.如果需要的是一个 ...
- bzoj 5099: [POI2018]Pionek
题解: 还是比较简单的一道题 考虑现在有一个向量,当且仅当下一个向量与它夹角<90度这个向量的模长才会增加 接下来怎么做呢 如果我们去枚举初始向量,向量方向会随着新增向量而变化 随着不断顺时针的 ...