装饰器:

需求----> 写一个功能,测试其他同事函数的调用效率。  

第一版:功能版

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)装饰器的更多相关文章

  1. python开发函数进阶:装饰器

    一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 作用:解耦,尽量的让代码分离,小功能之前的分离. 解耦目的,提高代码的重用性 二,设计模式 开放封闭原则 ...

  2. python教程(三)·函数进阶(下)

    下半部分果然很快到来,这次介绍函数的更高级用法,装饰器! 函数嵌套 先来说说函数嵌套,python中的函数是可以嵌套的,也就是说可以将一个函数放在另一个函数里面,比如: >>> de ...

  3. python进阶04 装饰器、描述器、常用内置装饰器

    python进阶04 装饰器.描述器.常用内置装饰器 一.装饰器 作用:能够给现有的函数增加功能 如何给一个现有的函数增加执行计数的功能 首先用类来添加新功能 def fun(): #首先我们定义一个 ...

  4. Python进阶(六)----装饰器

    Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: ​ 增加一些额外的新功能 封闭原则: ​ 不改变源码.以及调用方式 二丶初识装饰器 装饰器: ​ 也可称装饰器函数,诠释开放封闭原则 ...

  5. Python函数篇:装饰器

    装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...

  6. python基础之函数当中的装饰器

    在实际工作当中存在一个开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...

  7. 第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON

    关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...

  8. 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查

    内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...

  9. python语法生成器、迭代器、闭包、装饰器总结

    1.生成器 生成器的创建方法: (1)通过列表生成式创建 可以通过将列表生成式的[]改成() eg: # 列表生成式 L = [ x*2 for x in range(5)] # L = [0, 2, ...

随机推荐

  1. mongodb-导出数据到csv文件或json文件

    在mongodb的bin目录下, 有一个mongoexport, 可用于数据的导出 [wenbronk@localhost bin]$ ./mongoexport --help Usage: mong ...

  2. 基于json-lib-2.2.2-jdk15.jar的JSON解析工具类大集合

    json解析之前的必备工作:导入json解析必须的六个包 资源链接:百度云:链接:https://pan.baidu.com/s/1dAEQQy 密码:1v1z 代码示例: package com.s ...

  3. springboot启动太慢优化

    需求缘起:有人在[springboot]微信公众号问:springboot启动慢的问题何时有个分享就好了,谢谢.粉丝的问题还是要认真的回答的. 我们先看看本节的大纲: (1)组件自动扫描带来的问题(@ ...

  4. Node.js构建可扩展的Web应用1

    <Practical Node.js:Building Real-World Scalable Web Apps>[美]Azat Mardan(电子工业出版社) 安装node.js和NPM ...

  5. ABP学习入门系列(六)(菜单和分页)

    1,菜单.在最新的abp3.1.2中 菜单栏是在左侧的如下图(上中下的结构),中间部分就是我们要添加菜单的地方. ABP集成了通用的创建和显示菜单的方式,在展示层web下的appstart文件夹下找到 ...

  6. 【清北学堂 】Day 4 总结

    忙(tui)了这么多天,终于有时间认(sui)真(bian)做做总结了 随便开始:(反正也没听 一:读入输出优化 1 输入优化 <1>快读    废话不多说上代码 inline int r ...

  7. python之多进程multiprocessing模块

    process类介绍 multiprocessing 模块官方说明文档 Process 类用来描述一个进程对象.创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建 ...

  8. python之线程queue

    线程queue介绍 Queue的种类: FIFO:  Queue.Queue(maxsize=0) FIFO即First in First Out,先进先出.Queue提供了一个基本的FIFO容器,使 ...

  9. python学习之老男孩python全栈第九期_day017作业

    1. 三级菜单的代码看一遍 2. 斐波那契数列用递归实现:问第n个斐波那契数是多少 def fbnq(n): if n == 0 or n == 1: return 1 else: return fb ...

  10. Fastify 系列教程一 (路由和日志)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) Fastify ...