Python初学者第二十三天 函数进阶(2)装饰器
装饰器:
需求----> 写一个功能,测试其他同事函数的调用效率。
第一版:功能版
import time def func():
time.sleep(0.2)
print('非常复杂') def func1():
time.sleep(0.3)
print('超级复杂') # print(time.time())
start_time = time.time()
func()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))
第二版:函数版
import time
def func():
time.sleep(0.2)
print('非常复杂')
func()
def func1():
time.sleep(0.3)
print('超级复杂')
def timmer(f):
start_time = time.time()
f()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))
timmer(func)
# timmer(func1)
# func()
func()
# 如果在实际项目中测试函数,
# 假如函数有1500个,那么你1500个timmer(func),工作量很大。
# 你要在不改变函数执行的指令下,同时测试效率。
第三版:在不改变被测函数的执行方式下,同时测试执行效率
import time def func():
time.sleep(0.2)
print('非常复杂')
# func()
def func1():
time.sleep(0.3)
print('超级复杂') def timmer(f):
start_time = time.time()
f()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time)) timmer(func)
timmer(func1)
func()
f1 = func
func = timmer
func(f1) # timer(func)
装饰器的雏形:
import time
def func():
time.sleep(0.2)
print('非常复杂')
# func() def func1():
time.sleep(0.3)
print('超级复杂')
def timmer(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))
return inner
# 语法糖 @
func = timmer(func)
func()
func1 = timmer(func1)
func1()
装饰器的优化: # timmer 就是装饰器: 在不改变原函数的调用指令情况下,给原函数增加额外的功能。
在被测函数上方@timmer 即添加装饰器。代码从上执行时,遇到@timmer 会往下走一层,相当于func = timmer(func)
import time def timmer(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))
return inner @timmer # func = timmer(func)
def func():
time.sleep(0.2)
print('非常复杂')
func()
@timmer # func1 = timmer(func1)
def func1():
time.sleep(0.3)
print('超级复杂')
装饰器基础进阶1:带参数的装饰器 #*args,**kwargs 万能传参
import time def timmer(f):
def inner(*args,**kwargs): # 函数的定义: * 聚合。args = (1,2,3,434545,4234.)
# a1 = 'wusir'
# b1 = 'alex'
start_time = time.time()
f(*args,**kwargs) # 函数执行:* 打散。f(*(1,2,3,434545,4234.),)
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))
return inner @timmer # func = timmer(func)
def func(a,b):
time.sleep(0.2)
print('非常复杂%s%s'% (a,b))
func('wusir','alex') # inner()
装饰器基础进阶2:有返回值的装饰器
import time def timmer(f): # f = func
def inner(*args,**kwargs):
start_time = time.time()
ret = f(*args,**kwargs) # func()
end_time = time.time()
print('此函数的执行效率为%s' % (end_time - start_time))
return ret
return inner @timmer # func = timmer(func)
def func(a,b):
time.sleep(0.2)
print('非常复杂%s%s'% (a,b))
return 666
ret = func('wusir','alex') # inner()
print(ret) @timmer # func = timmer(func)
def func(a,b,c):
time.sleep(0.2)
print('非常复杂%s%s%s'% (a,b,c))
func('wusir','alex','barry') # inner()
装饰器用途:登录认证,打印日志等等。
总结:
其实装饰器本质是闭包,他的传参,返回值都是借助内层函数inner,
他之所以借助内层函数inner 就是为了让被装饰函数 在装饰器装饰前后,没有任何区别。
看起来没有变化。 装饰器的标准格式:
def auth(f): # f = func3函数名
def inner(*args,**kwargs): #万能传参
ret = f(*args,**kwargs)
return ret #返回值
return inner @auth
def comment():
print('欢迎来到评论页面')
comment()
Python初学者第二十三天 函数进阶(2)装饰器的更多相关文章
- python开发函数进阶:装饰器
一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 作用:解耦,尽量的让代码分离,小功能之前的分离. 解耦目的,提高代码的重用性 二,设计模式 开放封闭原则 ...
- python教程(三)·函数进阶(下)
下半部分果然很快到来,这次介绍函数的更高级用法,装饰器! 函数嵌套 先来说说函数嵌套,python中的函数是可以嵌套的,也就是说可以将一个函数放在另一个函数里面,比如: >>> de ...
- python进阶04 装饰器、描述器、常用内置装饰器
python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...
- Python进阶(六)----装饰器
Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: 增加一些额外的新功能 封闭原则: 不改变源码.以及调用方式 二丶初识装饰器 装饰器: 也可称装饰器函数,诠释开放封闭原则 ...
- Python函数篇:装饰器
装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...
- python基础之函数当中的装饰器
在实际工作当中存在一个开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...
- 第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON
关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...
- 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查
内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...
- python语法生成器、迭代器、闭包、装饰器总结
1.生成器 生成器的创建方法: (1)通过列表生成式创建 可以通过将列表生成式的[]改成() eg: # 列表生成式 L = [ x*2 for x in range(5)] # L = [0, 2, ...
随机推荐
- Java 集合框架:HashMap
原文出处:Java8 系列之重新认识 HashMap 摘要 HashMap 是 Java 程序员使用频率最高的用于映射 (键值对) 处理的数据类型.随着 JDK(Java Developmet Kit ...
- Docker容器打包成镜像 - OpenDaylight官方 SDN Hub Tutorial VM 的docker镜像
由于工作需要,在看OpenDaylight (一个SDN的开源控制器) 官方Tutorial有一个比较基础且介绍比较详细的文档(http://sdnhub.org/tutorials/opendayl ...
- java date相关
public static void getPreDay() throws ParseException{ String dateStr="2013-1-1"; D ...
- winform 导出datagridview 到excel
数据不多可以用下面的方式方法,如果数据较大,不建议这样使用,可能会比较卡如果电脑上没有Microsoft.Office.Interop.Excel.dll去找DLL下载站下载即可 需要先导入这个dll ...
- ASP.NET MVC 学习笔记-4.ASP.NET MVC中Ajax的应用
Ajax的全名为:Asynchronous Javascript And XML(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术.Ajax技术首先向Web服务器发送 ...
- 阿里云Maven仓库
<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexu ...
- 7行代码看EntityFramework是如何运行
这段时间在项目中运用Entity Framework作为底层数据交互框架.一个字,爽.不仅提高了开发效率,省了很多代码,而且数据库也规范了很多.按照网上的一些教程初步学习,然后实际运用了,再结合MVC ...
- VIM命令图解
右键在新窗口打开查看大图 删除所有:dG 来源见水印
- Hibernate的一对多实例
一对多在现实生活中很常见,今天做了个Hibernate的一对多的实例,也是个入门过程,写下来跟大家分享. 最重要的是xml配置文件,之前因为把英文"(引号)错误的复制成中文的“”(引号),导 ...
- php5.5过渡--变量
单纯的定义变量,如: $usernumber = $_POST['usernumber']; 会出现警告: Notice: Undefined index: usernumber in ... 规范问 ...