python学习笔记16-装饰器
装饰器(函数)
1.函数作用域
2.高阶函数 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就是指这种高度抽象的编程范式。
3.闭包 闭包就是能够读取其他函数内部变量的函数。
在本质上,闭包是将函数内部和函数外部连接起来的桥梁
如果一个内部函数里,对在外部作用域(但不是全局作用域)的变量进行引用,那么内部函数被认为是闭包
closure
闭包-函数+定义函数时的环境
def outer():
x=10
def inner(): #inner就是内部函数
print(x) #外部环境的一个变量
return inner #内部函数inner就是一个闭包函数 #以下可以取到inner
outer()()
#下面执行的时候 f()能取到x的值 就是因为inner时一个闭包函数
f=outer()
f() #inner() 不行 局部变量 全局无法使用
写代码的时候有一个开放封闭原则
解决一些重复功能
import time def foo():
print('foo ')
time.sleep(2) def bar():
print('bar ')
time.sleep(3) def show_time(f):
start_time=time.time()
f()
end_time=time.time()
time=end_time-start_time
print(time)
装饰器:
import time #装饰器函数
def show_time(f):
def inner():
start_time=time.time()
f()
end_time=time.time()
ctime=end_time-start_time
print(ctime)
return inner @show_time 等价于 foo=show_time(foo)
def foo():
print('foo ')
time.sleep(2) @show_time
def bar():
print('bar ')
time.sleep(3)
当被装饰的函数带有参数时:
#-*- coding:utf-8 -*- import time #装饰器函数
def show_time(f):
def inner(x,y):
start_time=time.time()
f(x,y)
end_time=time.time()
stime=end_time-start_time
print(stime)
return inner #等价于 foo=show_time(foo)
@show_time
def add(x,y):
print(x+y)
time.sleep(3)
add(1,2)
对于可变长参数
#-*- coding:utf-8 -*- import time #装饰器函数
def show_time(f):
def inner(*args,**kwargs):
start_time=time.time()
f(*args,**kwargs)
end_time=time.time()
stime=end_time-start_time
print(stime)
return inner #等价于 foo=show_time(foo)
@show_time
def add(*args,**kwargs):
sum=0
for i in args:
sum+=i
print(sum)
time.sleep(3) add(1,2,5)
当装饰函数需要参数以用来处理不同操作时 用于处理有些函数需要记录日志 而有些不需要
#-*- coding:utf-8 -*- import time #装饰器函数
def logger(flag=''):
def show_time(f):
def inner(*args,**kwargs):
start_time=time.time()
f(*args,**kwargs)
end_time=time.time()
stime=end_time-start_time
print(stime)
if flag=='true':
print('true')
return inner
return show_time
#等价于 foo=show_time(foo)
@logger('true')
def add(*args,**kwargs):
sum=0
for i in args:
sum+=i
print(sum)
time.sleep(3) @logger()
def bar():
print('') add(1,2,5)
bar()
类装饰器
#给每个类打印一句话
def Decorator(obj):
print("定义了一个装饰器函数")
return obj @Decorator #相当于执行 School = Decorator(School)
class School():
pass
python学习笔记16-装饰器的更多相关文章
- Python学习笔记:装饰器
Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...
- Python学习笔记012——装饰器
1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...
- python学习笔记(五):装饰器、生成器、内置函数、json
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...
- python学习笔记:装饰器2
python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 一.一般装饰函数实例: import datetime def func_name(func):#定义一个装饰函数, ...
- python学习笔记之装饰器、生成器、内置函数、json(五)
一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面 ...
- python学习笔记之装饰器、递归、算法(第四天)
参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...
- Python学习笔记之装饰器原理
def decorator(fn): def wrapper(): print("询价") fn() print("购买成功!") return wrapper ...
- python学习之day5,装饰器,生成器,迭代器,json,pickle
1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...
- Python学习——迭代器&生成器&装饰器
一.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素.迭代器仅 ...
- 从零开始的Python学习Episode 11——装饰器
装饰器 装饰器是用来处理其他函数的函数,主要作用是在不修改原有函数的情况下添加新的功能,装饰器的返回值也是一个函数对象. 简单的装饰器 import time def show_time(f): de ...
随机推荐
- iOS知识基础篇--@property,@synthesize, nonatomic,atomic,strong,weak,copy,assign,retain详解
一.@property 这个关键词的唯一作用就是声明getter.setter方法接口. 二.@synthesize 实现setter.getter方法,找不到实例变量则主动创建一个. 三.nonat ...
- 2018.11.17 hdu5829Rikka with Subset(ntt)
传送门 nttnttntt基础题. 考虑计算每一个数在排名为kkk时被统计了多少次来更新答案. 这样的话,设anskans_kansk表示所有数的值乘上排名为kkk的子集数的总和. 则ansk=∑i ...
- HDU 5663 Hillan and the girl (莫比乌斯反演 + 分块)
题意:给定n,m,求,其中F(x)=0,,如果x是完全平方数,否则是1. 析: 由于按照题意的F,不好筛选,所以我们反过来,F(x),x是平方数,就是1,否则是0. 这个是可以预处理出来的,可以用筛选 ...
- IP之ALTIOBUF仿真
这里实现了差分转单端的功能. 问题:差分信号的电平是怎样的?如果像平常一样不设置Pin Planner中的电平的话,编译会报错. 在Pin Planner中做了如下设置: `timescale 1 n ...
- Linux磁盘满问题分析
线上一台Linux服务器最近经常磁盘根分区满告警,但不是普通的日志文件或数据文件过多过大,现象如下: 1)执行“df -h”查看各分区空间的使用情况[root@XEN64 /]# df -hFiles ...
- Update Node.js Package.json
Update the latest package while using node.js, follow the command as following. npm i -g npm-check-u ...
- (转)C# 中使用分布式缓存系统Memcached
转自:http://blog.csdn.net/devgis/article/details/8212917 缘起: 在数据驱动的web开发中,经常要重复从数据库中取出相同的数据,这种重复极大的增加了 ...
- day30(对象转json(java))
转换之前需要知道什么是json json类似于map集合:键值对的方式存在,是一种轻量级数据交互格式. eg: {name:" ",age:15} [{name:" &q ...
- How to Start a Business in 10 Days
With an executive staffing venture about to open, a business loan from the in-laws gnawing at her co ...
- Eclipse怎么全局搜索和替换(整个项目)
我们用Eclipse编程,有时候需要将整个项目的某个字符串替换成其他的.那么我们该怎么操作呢?请接着往下看! 一,我们首先打开Eclipse,单击要替换字符串的项目 二,按下组合键:ctrl + H, ...