Python:Day16 闭包、装饰器
def outer():
x = 10
def inner(): #条件一、inner就是一个内部函数
print(x) #条件二、引用外部作用域的一个变量,因为x在函数外部的,所以是外部作用域的变量
return inner #结论:内部函数inner就是一个闭包 inner() #局部变量,全局无法调用
闭包(closure)是函数式编程的重要的语法结构
定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。
闭包可以脱离环境在外部调用
装饰器(函数)
装饰器的作用就是给功能函数添加新功能。
import time def show_time(func):
def inner():
start_time = time.time()
func()
time.sleep(1)
end_time = time.time()
print('spend time %s'%(end_time-start_time))
return inner @show_time #这条命令等价于 foo = show_time(foo),注意:这个show_time后面并没有加(),虽然看似没被调用,其实,show_time这个函数已经执行了。
def foo():
print('foo......') foo()
注意:1、装饰器要放在@上面,不然会报错。
2、装饰器一般用两层函数,外面一层用于将变量确定下来,里面一层函数执行整个功能。
3、其实一层函数也能为装饰器,只不过没有参数做为变动,程序就被写死了,不能做为公共接口。
带有参数的功能函数的装饰器:
import time def show_time(func):
def inner(*args): #首先这里要带参数,以便将参数传进功能函数
start = time.time()
func(*args) #这里面也要带参数,用来接收参数
end = time.time()
print('spend time %s'%(end-start))
return inner @show_time
def add(*args):
total = 0
for i in args:
total += i
print(total) add(1,2,3,4)
装饰器参数:
import time def logger(flag):
def show_time(func):
def inner():
start_time = time.time()
func()
time.sleep(1)
end_time = time.time()
print('spend time %s'%(end_time-start_time))
if flag == 'true':
print('日志记录')
return inner
return show_time @logger('true') #这里必须要加括号加参数,这才代表是一个装饰器参数,不然系统会执行foo=logger(foo),这样到show的时候就没有参数然后报错。
def foo():
print('foo.....') foo()
以上面的代码为例,带参数的装饰器其实是先执行logger("true")这个函数,这个函数执行返回show_time,这时上面其实就是@show_time,而@后面加一个函数名,就是将下面的函数名当参数传入到这个show_time()这个函数里面去,然后去执行,虽然没有调用,其实这里面也已执行了两次函数了。
Python:Day16 闭包、装饰器的更多相关文章
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
- 【Python】 闭包&装饰器
python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...
- python高级-闭包-装饰器
闭包内容: 匿名函数:能够完成简单的功能,传递这个函数的引用,只有功能 普通函数:能够完成复杂的功能,传递这个函数的引用,只有功能 闭包:能够完成较为复杂的功能,传递这个闭包中的函数以及数据,因此传递 ...
- python之闭包+装饰器
闭包 内部函数对外部函数作用域变量的引用. 函数内的属性都是有生命周期的,都是在函数执行期间 闭包内的闭包函数私有化了变量,类似于面向对象 图片解析 示例一 https://www.bilibili. ...
- python高级之装饰器
python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...
- Python深入05 装饰器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...
- Day04 - Python 迭代器、装饰器、软件开发规范
1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...
- 第二篇:python高级之装饰器
python高级之装饰器 python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函 ...
- python基础—函数装饰器
python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...
- python学习之装饰器-
python的装饰器 2018-02-26 在了解python的装饰器之前我们得了解python的高阶函数 python的高阶函数我们能返回一个函数名并且能将函数名作为参数传递 def outer() ...
随机推荐
- C# 添加Windows服务,定时任务。
源码下载地址:http://files.cnblogs.com/files/lanyubaicl/20160830Windows%E6%9C%8D%E5%8A%A1.zip 步骤 一 . 创建服务项目 ...
- Python 执行 mysql 存储过程
mysql 创建简单的临时表 tmp create database test; use test; DROP TABLE IF EXISTS `tmp`; CREATE TABLE `tmp` ( ...
- SQL Server: Datetime,Datetime2
select CONVERT(nvarchar(50), '2018-10-10 10:13:32.000', 126) select convert(nvarchar(MAX), '2018-10- ...
- CSS3效果:波浪效果
实现效果 如图所示: 首先得准备三张图,一张是浅黄色的背景图loading_bg.png,一张是深红色的图loading.png,最后一张为bolang.png. css代码 body{backgro ...
- loj#6029. 「雅礼集训 2017 Day1」市场(线段树)
题意 链接 Sol 势能分析. 除法是不能打标记的,所以只能暴力递归.这里我们加一个剪枝:如果区间内最大最小值的改变量都相同的话,就变成区间减. 这样复杂度是\((n + mlogn) logV\)的 ...
- 2018-12-16 VS Code英汉词典进化效果演示: 翻译文件所有命名
续VS Code英汉词典插件v0.0.7-尝试词性搭配, 下一个功能打算实现文件的批量命名翻译: 批量代码汉化工具 · Issue #86 · program-in-chinese/overview ...
- 13.Odoo产品分析 (二) – 商业板块(6) –采购(3)
接上一篇 查看Odoo产品分析系列--目录 接上一篇Odoo产品分析 (二) – 商业板块(6) –采购(2) 7. 仓库 仓库是在安装采购管理模块时出现的菜单.用于管理工厂库存,包括已经在手的货物 ...
- Spotlight on Mysql详细介绍
Spotlight on Mysql详细介绍 by:授客 QQ:1033553122 1. 版本 2. 使用介绍 1) 主页 会话面板 MySQL面板 INNODB面板 存储面板 主机面板 ...
- listview reclyerview上下拉刷新
x写控件挺麻烦的,因为有很多细节要处理好,列表控件使用太频繁了,网上也各种自定义的方法,一般的listview自定义肯定会联想到加个头部,然后监听事件加动画,其实方式很多种,今天记录的方式是另外一种方 ...
- Wu反走样算法绘制直线段
Wu反走样算法 原理:在我看来,Wu反走样算法是在Bresenham算法基础上改进了一番,它给最靠近理想直线/曲线的两个点以不同的亮度值,以达到模糊锯齿的效果.因为人眼看到的是线附近亮度的平均值. M ...