python反射、闭包、装饰器_python 闭包装饰器(一)
一、闭包
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 闭包装饰器(一)相关推荐
- python函数装饰函数_Python精进-装饰器与函数对象
本文为<爬着学Python>系列第四篇文章. 从本篇开始,本专栏在顺序更新的基础上,会有不规则的更新. 在Python的学习与运用中,我们迟早会遇到装饰器,这个概念对于初识装饰器的新手来说 ...
- python 函数装饰器_python函数装饰器的用法
函数装饰器: 开闭原则:在面向对象编程领域中,开闭原则规定"软件中的对象(类,模块,函数等等)应该对于扩展是开放的, 但是对于修改是封闭的",这意味着一个实体是允许在不改变它的源代 ...
- python函数修饰器_Python函数装饰器指南
Python 具有强大的功能和富有表现力的语法.我最喜欢的装饰之一.在设计模式的上下文中,装饰器动态更改方法或类功能,而不必直接使用子类.当您需要扩展功能,但不想修改原函数时,这是理想的选择.我们可以 ...
- python装饰器_Python基础-装饰器
作者:Zarten知乎专栏:Python基础深入详解知乎ID: Zarten简介: 互联网一线工作者,尊重原创并欢迎评论留言指出不足之处,也希望多些关注和点赞是给作者最好的鼓励 ! 概述 装饰器其实就 ...
- python闭包怎么理解_Python 闭包的理解
Last Updated on 2019年10月15日 Python中的闭包是一个比较模糊的概念,不太好理解,我最近的面试中也被问及,在一个单例模式的实现上,我用装饰器实现单例,然后面试官就问到了我对 ...
- python闭包的条件_python闭包
python闭包 闭包的条件 1.闭包函数必须返回一个函数对象 2.闭包函数内部的函数必须引用外部的函数的变量,(一般不能引用全局的变量),里面函数的返回值可有可无 闭包格式 def 外层函数(参数) ...
- python什么是闭包的作用域_Python闭包的作用域理解
什么是闭包 在维基中,闭包的解释是这样的: 在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的自由变量将和这个函数一同存在, ...
- python拷贝是什么知识点_python闭包、深浅拷贝、垃圾回收、with语句知识点汇总...
1.1 闭包 1.闭包概念 1. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了一个闭包 2. 一般情况下,在我们认知当中,如果一个函数 ...
- python闭包实现原理_Python 闭包详解
在函数编程中经常用到闭包.闭包是什么,它是怎么产生的及用来解决什么问题呢.给出字面的定义先:闭包是由函数及其相关的引用环境组合而成的实体(即:闭包=函数+引用环境)(想想Erlang的外层函数传入一个 ...
最新文章
- P3373 【模板】线段树 2 (未完待续)
- SQL Server 入门复习(2008)图解
- CSocket类的Receive超时的问题解决方案
- 【腾讯Bugly干货分享】Android Linker 与 SO 加壳技术
- httpclient爬取性感美图
- pragma pack(1) and #pragma pack(push,1)
- docker supervisor + compose
- axios post object object_Vue前端开发——数据交互axios
- xul中的快捷键及命令响应
- 图像仿射变换之倾斜的python实现
- 计算机类核心期刊投稿的一些资料汇总
- 使用Kinect测量身高
- Unity Spine动画如何选定帧数(时间)播放
- html5 地铁 代码,基于HTML5WebGL的地铁管理系统
- 传奇GOM引擎授权过期解决方法.
- 好看的小武与hs文件的偶遇
- 网管软件 LANDesk的配置(视频配截图)
- ARM与NEON加速指令
- 奇异值分解及几何意义
- 【控制】自适应控制基本概念
热门文章
- springboot Autowired BeanNotOfRequiredTypeException
- 让div垂直以及水平居中浏览器窗口
- 怎样永久更改嵌入式linux系统ip,如何修改嵌入式系统IP
- 编程入门python java和c语言_学习编程适不适合从Python入门?哪种语言更适合入门?...
- python数独游戏源代码100行_python实现自动解数独小程序
- TVM:使用 Schedule 模板和 AutoTVM 来优化算子
- mysql客户端重置密码是多少,mysql重置root密码
- java 停止线程播放音频_Notification 播放 关闭 声音----转载
- 怎么用计算机算立方数,计算器的使用方法
- 俩台电脑怎么设置同一局域网_方法 | 把手机上的照片传到电脑上