python 闭包&装饰器(一)
一、闭包
1.举例
def outer():
x = 10 def inner(): # 内部函数
print(x) # 外部函数的一个变量 return inner # 调用inner()函数的方法
outer()() # 法一 f = outer()
f() # 法二
注意:inner()是局部变量,在全局范围不可调用(即不能直接调用inner()函数),但是在法二中,在执行完 f = outer() 之后,outer()函数就已经结束,执行f()的时候却可以调用inner()函数,并输出x的值,这是因为outer()里 return 的 inner是一个闭包函数,里面有x这个环境变量
2.闭包的定义:(闭包 = 内部函数 + 定义环境时的变量)
如果在一个内部函数里,对在外部作用域(非全局)的变量(外部环境变量可以有很多)进行引用,那么内部函数就被称为闭包(如上例)。闭包函数为外部环境变量 在内部函数里引用提供了途径
二、装饰器
1.装饰器的定义及举例:
举例:
假如我们现在写一个函数f():
def f():
print('你是天才吗')
但是后来客户要求在调用f()函数的同时,要显示执行f()函数花费的多长时间,然后我们写了如下的显示函数:
import time def show_time():
start = time.time() # 显示计算机此刻的时间(不是传统的时间,而是linux自诞生至今所经过的时间)
f()
time.sleep(1) # 执行完f()之后停留一秒再执行下面的语句,因为f()的执行时间太短显示不出
end = time.time()
print("spend %s" % (end - start)) def f():
print('你是天才吗') show_time()
我们通过执行show_time() 执行了f()函数,并且返回了执行f()函数所花费的时间,但是却改变了调用方式,以前是直接调用f(),现在是调用show_time() ,这样做对于应用 此函数的人员影响很大,因为他们要把所有用f()函数的都改过来,而且如果要计算其他函数的执行时间,就要修改show_time()函数内部或者另外写一个函数,代码的重复率高,所以我们再做一个改进:
import time
def show_time(func):
def inner(): #定义一个外部函数
start = time.time() # 显示计算机此刻的时间(不是传统的时间,而是linux自诞生至今所经过的时间)
func()
time.sleep(1) # 执行完f()之后停留一秒再执行下面的语句,因为f()的执行时间太短显示不出
end = time.time()
print("spend %s" % (end - start))
return inner def f():
print('你是天才吗') f = show_time(f) # 此后我们不管需要那个函数的执行时间,只需要把 f 修改为对应的函数名即可
f()
对于 f = show_time(f) 还有一种写法:
import time
def show_time(func):
def inner(): #定义一个外部函数
start = time.time() # 显示计算机此刻的时间(不是传统的时间,而是linux自诞生至今所经过的时间)
func()
time.sleep(1) # 执行完f()之后停留一秒再执行下面的语句,因为f()的执行时间太短显示不出
end = time.time()
print("spend %s" % (end - start))
return inner @show_time # 相当于 f = show_time(f)
def f():
print('你是天才吗') f()
定义:函数show_time() 就是一个装饰器,它把真正的方法func包在了函数里面,看起来像func()被上下的时间函数装饰了, @符号是装饰器的语法,在定义函数的时候使用,避免再一次赋值

当程序运行时先执行@show_time,@show_time 帮我们做的就是当执行f() 时,执行的代码从黄框转向红框部分,相当于给了inner()一个执行的参数,仅此而已
python 闭包&装饰器(一)的更多相关文章
- Python闭包装饰器笔记
Python三大器有迭代器,生成器,装饰器,这三个中使用最多,最重要的就是装饰器.本篇将重要从函数嵌套开始讲起,从而引入闭包,装饰器的各种用法等. python中的一切都是一个对象(函数也是) 1.首 ...
- python 闭包@装饰器
1.装饰器 装饰器(Decorator)相对简单,咱们先介绍它:“装饰器的功能是将被装饰的函数当作参数传递给与装饰器对应的函数(名称相同的函数),并返回包装后的被装饰的函数”,听起来有点绕,没关系,直 ...
- python闭包&装饰器&偏函数
什么是闭包? 首先还得从基本概念说起,什么是闭包呢?来看下维基上的解释: 在计算机科学中,闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数.这个被引用的 ...
- 【Python】 闭包&装饰器
python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...
- Python 进阶_闭包 & 装饰器
目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...
- Python各式装饰器
Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义. 一.函数式装饰器:装饰器本身是一个函数. 1.装饰函数:被装饰对象是一个函数 [1]装饰器无参数: a.被装饰对象无参数: ...
- 【转】详解Python的装饰器
原文链接:http://python.jobbole.com/86717/ Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现 ...
- python 基础——装饰器
python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...
- 详解Python的装饰器
Python中的装饰器是你进入Python大门的一道坎,不管你跨不跨过去它都在那里. 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数. def sa ...
随机推荐
- 第十三篇 .NET高级技术之事件
案例:定一个Person类,定一个监听年龄变化的事件,当本命年的时候祝贺一下.触发事件的地方要判断一下是不是事件null 事件语法:event Mydelegate mdl; 加了event关键字实现 ...
- MYSQL性能调优与架构设计之select count(*)的思考
select count(*)的思考 原文:MYSQL性能调优与架构设计 举例: 这里我们就拿一个看上去很简单的功能来分析一下. 需求:一个论坛帖子总量的统计 附加要求:实时更新 在很多人看来,这 ...
- python之迷宫BFS
# @File: maze_queue_bfs from collections import deque maze = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0 ...
- MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)
一. MySQL 数据库 分页查询MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它 ...
- php服务端接收post的json数据
最近用到ext与PHP交互,ext把json数据post给PHP,但在PHP里面$_post获取不到,$_REQUEST也获取不到,但是通过firedebug看到的请求信息确实是把JSON数据post ...
- 【转】彻底解析Android缓存机制——LruCache
彻底解析Android缓存机制——LruCache 关于Android的三级缓存,其中主要的就是内存缓存和硬盘缓存.这两种缓存机制的实现都应用到了LruCache算法,今天我们就从使用到源码解析,来彻 ...
- html语法第 -2
1 <html> 2 <head> 3 <title>这是第一节课网页标题</title> 4 <meta charset="UTF-8 ...
- Android学习笔记--Intent
Intent是android四大组件之间交互的一种重要方式.Intent可以指明当前要执行的动作,也可以指明要传递的数据.Intent可以用来启动活动,启动服务,发送广播. Intent分为两种:1. ...
- zabbix告警邮件、短信发送错误快速排查方法
zabbix告警邮件.短信发送错误快速排查方法 背景 zabbix告警邮件.短信经常有同事反馈发送错误的情况,这个问题排查的角度很多,那么最快捷的角度是什么呢? 在我看来,最快的角度就是判断这个告警邮 ...
- [SQL]连续三天有销售额
店铺 销售日期 销售额 A 2017-10-11 300 A 2017-10-12 200 B 2017-10-11 400 B 2017-10-12 200 A 2017-10-13 100 A 2 ...