python_11 装饰器,闭包
装饰器:本质就是函数,功能是为其他函数添加附加功能
原则:
1.不修改被修饰函数的源代码
2.不修改被修饰函数的调用方式
装饰器的知识储备
装饰器=高阶函数+函数嵌套+闭包
#装饰器:
def timmer(func):
def wrapper(*args,**kwargs):
time1=time.time()
res=func(*args,**kwargs)
time2=time.time()
print('函数的运行时间是%d'%(time2-time1))
return res
return wrapper @timmer
def cal(l):
res=0
for i in l:
res+=i
time.sleep(0.1)
return res a=cal(range(10)) print(a) >>>函数的运行时间是1
45
高阶函数定义:
1.函数接收的是一个函数名
2.函数的返回值是一个函数名
3.满足上述任意一个条件都可以称之为高阶函数
import time def foo():
time.sleep(0.5)
print("sadfa") def test(func):
print(func)
t1=time.time()
func()
t2=time.time()
print("函数的运行时间是%ds"%(t2-t1)) test(foo)#修改了函数的调用方式
#不修改源代码
#不修改foo调用方式
#多运行了一次,不合格
def foo():
time.sleep(1)
print("from the foo") def dec(func):
t1=time.time()
func()
t2=time.time()
print("%s的运行时间是%d"%(func,(t2-t1)))
return func foo=dec(foo)
foo()
函数的闭包:闭包是由函数及其相关的引用环境组合而成的实体,如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
def father(name):
print('from father %s'%name)
def son():
print('my father is %s'%name)
def grandson():
print('my grandpa is %s'%name)
grandson()
son()
print(locals()) father('alex') >>>from father alex
my father is alex
my grandpa is alex
{'son': <function father.<locals>.son at 0x00000169A59B7268>, 'name': 'alex'}
装饰器框架:
#装饰器框架
def timmer(func):
def wapper():
print(func)
func()
return wapper
def timmer_test(func):
def add_time():
t1=time.time()
func()
t2=time.time()
print('该函数的运行时间是%d'%(t2-t1))
return add_time def test():
time.sleep(2)
print('test函数运行完毕') test=timmer_test(test)
test()
>>>test函数运行完毕
该函数的运行时间是2
@语法糖:
def timmer(func):
def add_time():
t1=time.time()
func()
t2=time.time()
print('该函数的运行时间是%d'%(t2-t1))
return add_time @timmer#@timmer 就相当于test=timmer(test)
def test():
time.sleep(2)
print('test函数运行完毕') test() >>>test函数运行完毕
该函数的运行时间是2
函数闭包加上返回值:
def timmer(func):
def add_time():
t1=time.time()
res=func()
t2=time.time()
print('该函数的运行时间是%d'%(t2-t1))
return res
return add_time @timmer#@timmer 就相当于test=timmer(test)
def test():
time.sleep(2)
print('test函数运行完毕')
return '这是test的返回值' res=test()#这里就是在运行add_time
print(res) >>>test函数运行完毕
该函数的运行时间是2
这是test的返回值
再加上参数:
def timmer(func):
def add_time(*args,**kwargs):
t1=time.time()
res=func(*args,**kwargs)
t2=time.time()
print('该函数的运行时间是%d'%(t2-t1))
return res
return add_time @timmer#@timmer 就相当于test=timmer(test)
def test(name,age):
time.sleep(2)
print('test函数运行完毕,名字是%s,年龄是%d'%(name,age))
return '这是test的返回值' @timmer
def test1(name,age,gender):
time.sleep(3)
print('test1函数运行完毕,名字是%s,年龄是%d,性别是%s'%(name,age,gender))
return '这是test1的返回值' res=test('alex',19)#这里的test是运行的add_time
print(res)
res1=test1('sb',20,'male')
print(res1) >>>test函数运行完毕,名字是alex,年龄是19
该函数的运行时间是2
这是test的返回值
test1函数运行完毕,名字是sb,年龄是20,性别是male
该函数的运行时间是3
这是test1的返回值
解压序列:
a,b,c='hel'
print(a,b,c) e,f,g=(4,5,6)
print(e,f,g) #取出第一个值和最后两个值
l=['alex',7,8,9,7,8,5,2,1,5,6,4,8,6,4,6,'is','sb'] #*_代表中间所有的值,_可以换成任意值
x,*_,y,z=l
print(x,y,z) >>>h e l
4 5 6
alex is sb
调换两变量的值:
a=20
b=100
a,b=b,a
print(a,b) >>>100 20
装饰器加上验证功能:
user_dic={'name':None,'login':False}
def yanzheng(func):
global zt
def wapper(*args,**kwargs):
if user_dic['name'] and user_dic['login']:
res=func(*args,**kwargs)
return
name=input('请输入用户名:').strip()
psw=input('请输入密码:').strip()
if name=='alex' and psw=='':
res=func(*args,**kwargs)
user_dic['name']=name
user_dic['login']=True
return res
else:
print('用户名或密码错误')
return wapper
@yanzheng
def index():
print('欢迎来到京东主页')
@yanzheng
def home(name):
print('欢迎回家%s'%name)
@yanzheng
def car(name):
print('%s的购物车里有%s'%(name,'奶茶'))
index()
home('alex')
car('alex')
>>>请输入用户名:alex
请输入密码:123
欢迎来到京东主页
欢迎回家alex
alex的购物车里有奶茶
user_list=[
{'user_name':'alex','psw':''},
{'user_name':'blex','psw':''},
{'user_name':'clex','psw':''},
{'user_name':'dlex','psw':''} ] current_zt={'name':None,'login':False} def yanzheng(func):
def wapper(*args,**kwargs):
global user_name
if current_zt['name'] and current_zt['login']:
res=func(*args,**kwargs)
return res
user_name=input('请输入用户名:').strip()
psw=input('请输入密码:').strip()
for user_dic in user_list:
if user_name==user_dic['user_name'] and psw==user_dic['psw']:
res=func(*args,**kwargs)
current_zt['name']=user_name
current_zt['login']=True
return res
else:
print('用户名或密码错误')
return wapper @yanzheng
def index():
print('欢迎来到京东主页') @yanzheng
def home():
print('欢迎回家%s'%user_name) @yanzheng
def car():
print('%s的购物车里有%s'%(user_name,'奶茶')) index()
home()
car() >>>请输入用户名:blex
请输入密码:456
欢迎来到京东主页
欢迎回家blex
blex的购物车里有奶茶
将原装饰器加上参数:直接在最外层加一个函数带上参数,使用装饰器时也需带上参数
user_list=[
{'user_name':'alex','psw':''},
{'user_name':'blex','psw':''},
{'user_name':'clex','psw':''},
{'user_name':'dlex','psw':''} ] current_zt={'name':None,'login':False} def renzhen(type='ldb'):
def yanzheng(func):
def wapper(*args,**kwargs):
global user_name
print('认证类型是%s'%type)
if type=='ldb':
if current_zt['name'] and current_zt['login']:
res=func(*args,**kwargs)
return res
user_name=input('请输入用户名:').strip()
psw=input('请输入密码:').strip()
for user_dic in user_list:
if user_name==user_dic['user_name'] and psw==user_dic['psw']:
res=func(*args,**kwargs)
current_zt['name']=user_name
current_zt['login']=True
return res
else:
print('用户名或密码错误')
elif type=='abb':
print('不知道这个类型')
res = func(*args, **kwargs)
return res
else:
print('类型错误')
res = func(*args, **kwargs)
return res
return wapper
return yanzheng @renzhen(type='ldb')
def index():
print('欢迎来到京东主页') @renzhen(type='abb')
def home():
print('欢迎回家%s'%user_name) @renzhen(type='sss')
def car():
print('%s的购物车里有%s'%(user_name,'奶茶')) index()
home()
car()
python_11 装饰器,闭包的更多相关文章
- python中函数总结之装饰器闭包
1.前言 函数也是一个对象,从而可以增加属性,使用句点来表示属性. 如果内部函数的定义包含了在外部函数中定义的对象的引用(外部对象可以是在外部函数之外),那么内部函数被称之为闭包. 2.装饰器 装饰器 ...
- 函数基础(三) 装饰器\闭包 day 12
目录 昨日回顾 可变长参数 * ** 函数对象 函数嵌套 名称空间和作用域 今日内容 闭包函数 装饰器 语法糖 装饰器模板 迭代器 昨日回顾 可变长参数 * *形参:接受多余的位置实参 *实参(可迭代 ...
- python之闭包与装饰器
python闭包与装饰器 闭包 在函数内部定义的函数包含对外部的作用域,而不是全局作用域名字的引用,这样的函数叫做闭包函数. 示例: #-------------------------------- ...
- 15 python 初学(闭包,函数装饰器)
这一部分很重要,一定要透彻理解.可参考大神博客: http://www.cnblogs.com/yuanchenqi/articles/5830025.html 闭包: 如果在一个内部函数里,对在外 ...
- python 闭包与装饰器
1.闭包--返回子函数名 作用:使用子函数之外的父函数的变量 闭包就是你调用了一个函数a,这个函数a反悔了一个子函数名b,这个返回的函数b就叫做闭包 代码举例 def a(): test = 'aa' ...
- python基础-闭包函数和装饰器
闭包函数和装饰器 闭包函数 概念:在函数中(嵌套)定义另一个函数时,内部函数引用了外层函数的名字. 特性 闭包函数必须在函数内部定义 闭包函数可引用外层函数的名字 闭包函数是函数嵌套.函数对象.名称空 ...
- Python学习基础(三)——装饰器,列表生成器,斐波那契数列
装饰器——闭包 # 装饰器 闭包 ''' 如果一个内部函数对外部(非全局)的变量进行了引用,那么内部函数被认为是闭包 闭包 = 函数块 + 定义时的函数环境 ''' def f(): x = 100 ...
- Day13有参装饰器,三元表达式,匿名函数
多个装饰器: 加载顺序:由下而上 执行顺序:由上而下 有参装饰器: 闭包,给函数传参的一种方法 当装饰器内需要参数时,可以采用闭包形式给其传参,第三层函数接收完参数时,就变为无参装饰器 三元表达式: ...
- python基础知识10-描述器和装饰器
课前的解答 1.vim怎么退出都知道吧,配置了pep8,所以说会出现退出的时候error,再退出一次就ok q:退出 w:保存 wq 保存退出 q!:强制退出 shift + zz:保存退出 x:保存 ...
随机推荐
- 【puppeteer】前端自动化初探(一)
一.前提 windows环境的puppeteer环境配置要简单点,mac环境坑竟然有点多,这边稍微提下 二.开发环境 nodejs puppeteer mac 三.简单介绍下puppeteer Pup ...
- day-06数据类型与深浅拷贝
深浅拷贝 # 值拷贝:应用场景最多 ls = [1, 'abc', [10]] ls1 = ls # ls1直接将ls中存放的地址拿过来# ls内部的值发生任何变化,ls1都会随之变化 ls2 = l ...
- TensorFlow机器学习实战指南之第二章
一.计算图中的操作 在这个例子中,我们将结合前面所学的知识,传入一个列表到计算图中的操作,并打印返回值: 声明张量和占位符.这里,创建一个numpy数组,传入计算图操作: import tensorf ...
- Python assert(断言)
Python assert(断言)可以分别后面的判断是否正确,如果错误会报错 示例: a = 1 assert type(a) is int print('No problem') 输出结果: No ...
- 时间规划在Optaplanner上的实现
在与诸位交流中,使用较多的生产计划和路线规划场景中,大家最为关注的焦点是关于时间的处理问题.确实,时间这一维度具有一定的特殊性.因为时间是一维的,体现为通过图形表示时,它仅可以通过一条有向直线来表达它 ...
- 【PLM】【PDM】60页PPT终于说清了PDM和PLM的区别;智造时代,PLM系统10大应用趋势!
https://blog.csdn.net/np4rhi455vg29y2/article/details/79266738
- MVC object htmlAttributes,IDictionary<string, object> htmlAttributes 写法
MVC object htmlAttributes:new {style="color:red",width="12px",height="10px& ...
- WIN10X64_LTSB2016极限精简版by双心
WIN10X64LTSB2016极限精简版by双心http://www.cnblogs.com/liuzhaoyzz/p/9162113.html 一.前言:关于极限精简版的说明 本系统为极限精简版, ...
- 《剑指offer(第二版)》面试题60——n个骰子的点数
一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...
- Kong(V1.0.2)Network & Firewall
介绍 在本节中,您将找到关于Kong推荐的网络和防火墙设置的摘要.PortsKong使用多个连接用于不同的目的. 代理 管理api Proxy 代理端口是Kong接收传入流量的地方.有两个端口具有以下 ...