这一节主要讲的是装饰器。装饰器是一个非常好用的,用于装饰已有函数的函数功能。

其优点是不用修改调用方式,还不用修改源代码。

他的思想是:函数既变量;高阶函数;嵌套函数。

现在来尝试写装饰器

有两个函数 各自实现自己的功能 
每个函数执行的时候 都肯定要消耗时间
那现在 就写一个装饰器 来统计这两个函数的运行时间
 
首先 把这两个函数写好
 要注意的是 不可以改变函数的调用方式
test1 函数的调用 —— test1()
test2 函数的调用 —— test2()
 
 怎样才能在不改变函数调用方式的前提下 给函数增加功能呢
首先 要搞一个高阶函数
然后 把函数传给高阶函数 当作参数
 
这样子 运行效果:
功能 是加上去了 但是 调用方式也改变了 这样不行
 
 高阶函数还没有用到呢
import time

def timer(func): def deco(): start_time = time.time() func() stop_time = time.time() print('----------the func run time is %s' %(stop_time-start_time)) return deco

def foo1(): time.sleep(1) print('----------i am in foo 111----------')

def foo2(): time.sleep(2) print('----------i am in foo 222----------')

foo1 = timer(foo1)foo1()

foo2 = timer(foo2)foo2()

高阶函数 就是在本来已经实现了功能的代码段外面 再套一层
 
本来实现计时功能的代码:
def deco(func): start_time = time.time() func() stop_time = time.time() print('----------the func run time is %s' %(stop_time-start_time))

外面套一层:

def timer(func): def deco(): start_time = time.time() func() stop_time = time.time() print('----------the func run time is %s' %(stop_time-start_time)) return deco

还有一种语法糖
比方说 timer 是实现了附加功能的代码:
def timer(func): def deco(): start_time = time.time() func() stop_time = time.time() print('----------the func run time is %s' %(stop_time-start_time)) return deco

那现在要给 foo1 函数增加功能 就这样:

@timerdef foo1(): time.sleep(1) print('----------i am in foo 111----------')

要给 foo2 函数增加功能 就这样:
@timerdef foo2(): time.sleep(2) print('----------i am in foo 222----------')

最后运行的时候 就像原先的调用方式一样就可以了
foo1()

foo2()

运行结果 功能加上了 同时函数调用方式没有变:
7.7 调试方式运行
先是导入模块:import time
然后走到下一行 timer 函数的定义:def timer(func):
(因为 python 它是解释执行 所以是按顺序一行一行去执行的)
 
再往下走:函数体没有执行 直接跳到语法糖:
因为 def 里面的函数体 它只是一个定义 它没有调用 所以就不执行
 

然后再往下 从语法糖 直接跳到:foo1()
中间的 foo1 函数的定义也不执行 原理跟上面那个 timer 不执行一样
 
foo1() 这句是函数调用 这句调用直接引导到 deco 函数的定义
 
这是为什么呢? —— 因为刚才运行语法糖的时候 它实际上运行的是:
foo1 = timer(foo1)
它实际上就是把 timer 函数 赋值给 foo1 这个变量
所以 foo1 已经被替换成了 timer 所以调用 foo1 的时候 会去执行 timer
然后蹦到 def deco() 的时候 它也是一个定义 没有调用 跟上面说过的那样
它不执行中间的函数体 直接跳到 return deco 返回了
 
继续往下走 又走到了 foo1() 这次直接跳到了 deco 函数去执行它 
所以其实执行 test1 函数 就是执行 deco 函数
在执行 deco 函数的时候 先取了一个 start_time
然后执行 func() 函数
 
执行 func() 函数 其实就是执行 foo1() 函数
这是因为 语法糖里面已经把 foo1 作为参数传给了 timer(func) 函数
执行 foo1() 函数 就是进入 foo1() 函数的函数体 
先睡 1 秒 然后 print 一行话
 
之后 再取一个 stop_time 然后再 print 一行话 结束

转载于:https://www.cnblogs.com/lovelyming/p/7265661.html

python学习之路(九)相关推荐

  1. Python学习之路9☞面向对象的程序设计

    Python学习之路9☞面向对象的程序设计 一 面向对象的程序设计的由来 见概述:http://www.cnblogs.com/linhaifeng/articles/6428835.html 二 什 ...

  2. python之路 mysql 博客园_教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql...

    教为学:Python学习之路(二):MySQLdb的几种安装方式,以及用Python测试连接MySql Easy_install安装MySQLdb 很简单,以至于我不晓得该怎么说.一句话. sodu ...

  3. Python学习之路—2018/7/14

    Python学习之路-2018/7/12 3.功能开发 3.3 设计博客首页 博客首页中最重要的就是中间的文章区域,所以我首先把文章区域设计出来,一开始并没有数据,如果用orm添加或者直接在数据库添加 ...

  4. Python学习之路—2018/6/20

    Python学习之路-2018/6/20 1.模板语法之变量 views.py def index(request):import datetimes="gyq"l=[1,2,3] ...

  5. python学习笔记(九)之语句1

    python学习笔记(九)之语句1 print python2中,print是一个语句,python3中它是一个函数. 实例1: >> print "hello,world!&q ...

  6. python 学习之路开始了

    python 学习之路开始了.....记录点点滴滴.... 转载于:https://www.cnblogs.com/chobit/p/6163287.html

  7. Python学习之路5☞文件处理

    Python学习之路5☞文件处理 一.文件处理流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 1 正趣果上果 2 Interesting fruit fruit 3 4 ...

  8. python学习之路0x00

    Python学习之路0x00 在学习python之前,要知道什么是python? python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,与c语言不同, c语言要编译后才能执行.而 ...

  9. 我的Python学习之路(一)_Mr_Ouyang

    我的Python学习之路(一)_Mr_Ouyang 笔者按: 本文从18:55开始写作,至19:38中断,又从21:12始继续,至23:22写就. 共计耗时113分钟,总字数9081字,约80.4字/ ...

  10. 一木.溪桥---Python学习之路

    一木.溪桥---Python学习之路 1.工作十年常常想起的一些人和一些事 2.选择学习Python的初衷 1.工作十年常常想起的一些人和一些事 我是一名成套电气工程师,专业是电气工程及其自动化(供配 ...

最新文章

  1. 结构成员访问的三种方法
  2. Linux与Windows文件共享命令 rz,sz
  3. 谷歌宣布对外开放聊天机器人数据分析平台Chatbase
  4. 【精解】Exchange Server 2007群集连续复制
  5. IOC--IOC+AOP--热插拔的系统架构实现演化
  6. Linux操作系统备份之二:通过tar拷贝分区实现Linux操作数据的在线备份
  7. android 辐射动画_Android 四种动画效果的调用实现代码
  8. HTML5期末大作业:体育主题网站设计——足球(9页) HTML+CSS+JavaScrip校园篮球网页作业成品 学校篮足球网页制作模板 学生简单体育运动网站设计成品
  9. 华为USG6000V双机热备HRRP
  10. SUSE Linux 网络配置
  11. 什么是请求报文和响应报文?
  12. 华为员工工资曝光:入职12年月薪31万,小编我瑟瑟发抖
  13. keil下汇编语言调试分析
  14. 关于对接海康威视综合安防平台并使用SDK下载过车视频
  15. dpdk-pktgen进行发包,dpdk-testpmd和dpdk-pdump进行收包并保存为pcap文件
  16. 服务器文件被篡改evopro后缀,SQLServer数据库服务器mdf文件中了勒索病毒,扩展名被篡改为.fuk25933...
  17. 苹果生产日期对照表2020_苹果又开发布会,确定于11月11日举办特别活动 | AirPods Pro 免费换新计划...
  18. 什么是IPQC(制程控制)?
  19. Vue2.0 新手完全填坑攻略——从环境搭建到发布
  20. 文献阅读-融合注意力机制的 IETM 细粒度跨模态检索算法

热门文章

  1. 处理ajax的session超时
  2. Linked List Cycle II - LeetCode
  3. Java基础之写文件——缓冲区中的多条记录(PrimesToFile3)
  4. asp.net发送邮件时在正文中插入图片
  5. DataTable的计算功能(转)
  6. Spring的refresh()方法调用过程
  7. JavaScript 面向对象的程序设计1
  8. 06 事件处理函数绑定与事件对象
  9. Vue学习笔记(二)—— vue项目中使用axios
  10. Windows系统下oracle数据库每天定时备份