一、闭包

1.举例

defouter():

x= 10

def inner(): #内部函数

print(x) #外部函数的一个变量

returninner#调用inner()函数的方法

outer()() #法一

f=outer()

f()#法二

注意:inner()是局部变量,在全局范围不可调用(即不能直接调用inner()函数),但是在法二中,在执行完 f=outer() 之后,outer()函数就已经结束,执行f()的时候却可以调用inner()函数,并输出x的值,这是因为outer()里 return 的 inner是一个闭包函数,里面有x这个环境变量

2.闭包的定义:(闭包 = 内部函数 + 定义环境时的变量)

如果在一个内部函数里,对在外部作用域(非全局)的变量(外部环境变量可以有很多)进行引用,那么内部函数就被称为闭包(如上例)。闭包函数为外部环境变量在内部函数里引用提供了途径

二、装饰器

1.装饰器的定义及举例:

举例:

假如我们现在写一个函数f():

deff():print('你是天才吗')

但是后来客户要求在调用f()函数的同时,要显示执行f()函数花费的多长时间,然后我们写了如下的显示函数:

importtimedefshow_time():

start= time.time() #显示计算机此刻的时间(不是传统的时间,而是linux自诞生至今所经过的时间)

f()

time.sleep(1) #执行完f()之后停留一秒再执行下面的语句,因为f()的执行时间太短显示不出

end =time.time()print("spend %s" % (end -start))deff():print('你是天才吗')

show_time()

我们通过执行show_time() 执行了f()函数,并且返回了执行f()函数所花费的时间,但是却改变了调用方式,以前是直接调用f(),现在是调用show_time() ,这样做对于应用 此函数的人员影响很大,因为他们要把所有用f()函数的都改过来,而且如果要计算其他函数的执行时间,就要修改show_time()函数内部或者另外写一个函数,代码的重复率高,所以我们再做一个改进:

importtimedefshow_time(func):definner(): #定义一个外部函数

start= time.time() #显示计算机此刻的时间(不是传统的时间,而是linux自诞生至今所经过的时间)

func()

time.sleep(1) #执行完f()之后停留一秒再执行下面的语句,因为f()的执行时间太短显示不出

end =time.time()print("spend %s" % (end -start))returninnerdeff():print('你是天才吗')

f=show_time(f) #此后我们不管需要那个函数的执行时间,只需要把 f 修改为对应的函数名即可

f()

对于 f=show_time(f)  还有一种写法:

importtimedefshow_time(func):def inner(): #定义一个外部函数

start = time.time() # 显示计算机此刻的时间(不是传统的时间,而是linux自诞生至今所经过的时间)

func()

time.sleep(1) #执行完f()之后停留一秒再执行下面的语句,因为f()的执行时间太短显示不出

end =time.time()print("spend %s" % (end -start))returninner

@show_time#相当于 f = show_time(f)

deff():print('你是天才吗')

f()

定义:函数show_time() 就是一个装饰器,它把真正的方法func包在了函数里面,看起来像func()被上下的时间函数装饰了,  @符号是装饰器的语法,在定义函数的时候使用,避免再一次赋值

当程序运行时先执行@show_time,@show_time 帮我们做的就是当执行f() 时,执行的代码从黄框转向红框部分,相当于给了inner()一个执行的参数,仅此而已

python反射、闭包、装饰器_python 闭包装饰器(一)相关推荐

  1. python函数装饰函数_Python精进-装饰器与函数对象

    本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...

  2. python 函数装饰器_python函数装饰器的用法

    函数装饰器: 开闭原则:在面向对象编程领域中,开闭原则规定"软件中的对象(类,模块,函数等等)应该对于扩展是开放的, 但是对于修改是封闭的",这意味着一个实体是允许在不改变它的源代 ...

  3. python函数修饰器_Python函数装饰器指南

    Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...

  4. python装饰器_Python基础-装饰器

    作者:Zarten知乎专栏:Python基础深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 ! 概述 装饰器其实就 ...

  5. python闭包怎么理解_Python 闭包的理解

    Last Updated on 2019年10月15日 Python中的闭包是一个比较模糊的概念,不太好理解,我最近的面试中也被问及,在一个单例模式的实现上,我用装饰器实现单例,然后面试官就问到了我对 ...

  6. python闭包的条件_python闭包

    python闭包 闭包的条件 1.闭包函数必须返回一个函数对象 2.闭包函数内部的函数必须引用外部的函数的变量,(一般不能引用全局的变量),里面函数的返回值可有可无 闭包格式 def 外层函数(参数) ...

  7. python什么是闭包的作用域_Python闭包的作用域理解

    什么是闭包 在维基中,闭包的解释是这样的: 在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在, ...

  8. python拷贝是什么知识点_python闭包、深浅拷贝、垃圾回收、with语句知识点汇总...

    1.1 闭包 1.闭包概念 1. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包 2. 一般情况下,在我们认知当中,如果一个函数 ...

  9. python闭包实现原理_Python 闭包详解

    在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个 ...

最新文章

  1. P3373 【模板】线段树 2 (未完待续)
  2. SQL Server 入门复习(2008)图解
  3. CSocket类的Receive超时的问题解决方案
  4. 【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术
  5. httpclient爬取性感美图
  6. pragma pack(1) and #pragma pack(push,1)
  7. docker supervisor + compose
  8. axios post object object_Vue前端开发——数据交互axios
  9. xul中的快捷键及命令响应
  10. 图像仿射变换之倾斜的python实现
  11. 计算机类核心期刊投稿的一些资料汇总
  12. 使用Kinect测量身高
  13. Unity Spine动画如何选定帧数(时间)播放
  14. html5 地铁 代码,基于HTML5WebGL的地铁管理系统
  15. 传奇GOM引擎授权过期解决方法.
  16. 好看的小武与hs文件的偶遇
  17. 网管软件 LANDesk的配置(视频配截图)
  18. ARM与NEON加速指令
  19. 奇异值分解及几何意义
  20. 【控制】自适应控制基本概念

热门文章

  1. springboot Autowired BeanNotOfRequiredTypeException
  2. 让div垂直以及水平居中浏览器窗口
  3. 怎样永久更改嵌入式linux系统ip,如何修改嵌入式系统IP
  4. 编程入门python java和c语言_学习编程适不适合从Python入门?哪种语言更适合入门?...
  5. python数独游戏源代码100行_python实现自动解数独小程序
  6. TVM:使用 Schedule 模板和 AutoTVM 来优化算子
  7. mysql客户端重置密码是多少,mysql重置root密码
  8. java 停止线程播放音频_Notification 播放 关闭 声音----转载
  9. 怎么用计算机算立方数,计算器的使用方法
  10. 俩台电脑怎么设置同一局域网_方法 | 把手机上的照片传到电脑上