python学习——装饰器函数
一、装饰器函数的作用是什么
答:装饰器函数是在不修改原函数及其调用方式的情况下对原函数功能进行扩展
对于搞python开发的人来说,函数占据了至关重要的地位。都说学好函数你就可以去找工作了,好了,假如你已经在某个公司上班了,想到马上就要过年了,那过年就意味着你可以向老板要年终奖金了,那凭什么老板要给你年终奖呢,你又能得到多少年终奖金呢。老板是这样说的,你给我至少写1000行代码,我来看一下你代码的执行时间,根据你的执行时间来评你的年终奖。好了,你知道既然要计算时间,学过函数的你就来实现一个计算函数执行时间的函数呗。聪明的你是这样的。
import time def qqxing():
start = time.time()
print('老板好,同事好,大家新年好')
end = time.time()
elapsed_time = (end - start)
print(elapsed_time) qqxing() #运行结果:老板好,同事好,大家新年好
# 0.0
计算函数的执行时间
实现了计算时间的函数,可是你发现了执行时间为0,因为你写得函数太厉害了,但如果是的话怕吓到老板,所以你这样搞。
import time def qqxing():
start = time.time()
time.sleep(0.1)
print('老板好,同事好,大家新年好')
end = time.time()
elapsed_time = (end - start)
print(elapsed_time) qqxing() #运行结果:老板好,同事好,大家新年好
# 0.10044193267822266
计算函数的执行时间
ok,虽然实现了,但是你写了500个函数,你难道要每个函数都加上计算时间的函数吗?能不能这样搞?
import time def timmer(func):
start = time.time()
func()
end = time.time()
print(end - start) def func1():
print('func1 over') def func2():
print('func2 over') timmer(func1)
timmer(func2)
计算多个函数的执行时间
这样是不是好多了,基本可以实现,但你会发现实际上当我调用func()函数时,调用方式改变了,由原来的func()变成timmer(func)了,那能不能不改变原函数的调用方式呢?可不可以这样。
import time def timmer(func):
start = time.time()
func()
end = time.time()
print(end - start) def func():
print('func over')
func = timmer
timmer()
不改变函数调用方式
这样就完美了,可惜我太天真,当执行函数时会报错,因为timmer(func)要传一个值,而你明目张胆的就给python解释器来一个func = timmer,这哪行!而我们在用函数作为变量赋值的时候是没法传参数的。所以你没法了。至此你得出了一个结论:年终奖与我无缘!
python学习——装饰器函数的更多相关文章
- Python学习---装饰器/迭代器/生成器的学习【all】
Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210
- Python学习---装饰器的学习1210
装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包 [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前 ...
- day12 python学习 装饰器
闭包函数: 内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数#函数内部定义的函数称为内部函数 闭包函数获取网络应用 from urllib.request import url ...
- python学习---装饰器
什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数 ...
- python之装饰器函数
本章内容 引入 装饰器的形成过程 开放封闭原则 谈装饰器主要功能和装饰器固定结构 带参数的装饰器 多个装饰器装饰一个函数 引入 作为一个会写函数的python开发,我们从今天开始要去公司上班了.写了一 ...
- python递归,装饰器,函数, 高阶函数
在函数内部,可以调用其它函数,如果一个函数在内部调用自身本身,这个函数就是递归函数 递归特性:1.必须有一个明确的结束条件 2.每次进入更深一层递归时,问题规模比上次递归都有所减少(10-8-5等) ...
- Python学习——装饰器/decorator/语法糖
装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...
- python之装饰器(函数)
1. 装饰器 遵循的原则: 开闭原则: 对功能的扩展开放 对代码的修改是封闭 # 通用装饰器写法 # 存在的意义: 在不破坏原有函数和原有函数调用的基础上,给函数添加新的功能. def wrapp ...
- 【Python】装饰器实现日志记录
好的日志对一个软件的重要性是显而易见的.如果函数的入口都要写一行代码来记录日志,这种方式实在是太低效了,但一直没有找到更好的方法.后来用python写一些软件,了解到python的装饰器功能时,突然人 ...
随机推荐
- 【转】vector中对象指针的排序
原文:http://blog.csdn.net/tanlijun37/article/details/1948493 vector中对象指针的排序,初步想法是1: 把对象指针存到vector,重载bo ...
- C语言 条件编译(if )
#include <stdio.h> #define NUM -1 int main(int argc, const char * argv[]) { #if NUM > 0 pri ...
- asp.net反射的运用
反射的用途: (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例. (2)使用Module了解包含模块的程序集以及模块中的 ...
- HDU 2647 拓扑排序
题意:每个人的工资至少888,然后有m个条件,前者比后者要多.求最少工资. 分析: 最开始的开邻接矩阵的肯定超时,如果dfs,会出现由于刚开始不是从入度为0的点出发,后期修改不了.比较麻烦. 正确方式 ...
- c++ 单引号和双引号
c++中单引号表示一个字符,双引号表示字符串 python中单引号与双引号是一样的
- 利用babel自动编译es6文件
一.检查File-Watchers中Babel的Arguments,有一项presets的设置,把他更改为=es2015,详细设置如下: $FilePathRelativeToProjectRoot$ ...
- maven 项目运行找不到类
其实maven 仓库有jar包,可能未编译或破损, 在本地仓删除它,然后maven install
- 【luogu P1040 加分二叉树】 题解
题目链接:https://www.luogu.org/problemnew/show/P1040 今天考试考了一个区间DP...没错就是这个... 太蒟了真是连区间DP都不会...看了看题解也看不懂, ...
- 字段中有空的时候 进行逻辑运算,mysql 与 oracle 处理函数IFNULL() 与 nvl() ,选取NULL 值 。
mySQL数据库: SELECT id_p,IFNULL(math,0)+IFNULL(english,0) 总分 from mytest_brian1 Oracle 数据库: select id_ ...
- Swift_Set详解
Swift_Set详解 点击查看源码 初始化 //初始化 fileprivate func testInit() { //空Set var set = Set<String>() prin ...