1.importtime
a.time.time()
获取到当前的时间,返回值为浮点型
importtime
print(time.time())#1565422783.6497557
b.time.sleep()
让程序执行到这个位置暂停一会
importtime
start=time.time()
time.sleep(0.5)
print('helloworld!')
end=time.time()
print(end-start)#0.5000286102294922
2.装饰器函数
开发原则:开放封闭原则
装饰器的作用:在不改变原函数的情况下,在函数的前后添加功能
装饰器的本质:闭包函数
当想要知道一个程序执行的时间
importtime
start=time.time()
time.sleep(0.5)
print('helloworld!')
end=time.time()
print(end-start)#0.5000286102294922
再将里面的功能单独拉出来变成一个函数
importtime
deffunc():
time.sleep(0.5)
print('helloworld!')
deftimer(func):
start=time.time()
func()
end=time.time()
print(end-start)
timer(func)#helloworld!
#0.5000286102294922
将timer变成一个简单的装饰器
importtime
deffunc():#被装饰的函数
time.sleep(0.5)
print('helloworld!')
deftimer(func):#装饰函数
definner():
start=time.time()
func()
end=time.time()
print(end-start)
returninner#回传inner函数的内存地址
get_inner=timer(func)#后者得到的是inner的内存地址再赋值给get_inner
get_inner()#helloworld!
#0.5000286102294922
执行步骤:
开放封闭原则:开放指的是对扩展开放,封闭指的是对修改封闭
语法糖:@装饰器函数名可以替代下面的写法
装饰带一般参数且有返回值函数的装饰器
importtime
defwrapper(f):#装饰器函数
definner(x):
res=f(x)
returnres
returninner
@wrapper#相当于fuc=wrapper(fuc)
deffuc(var):#被装饰的函数
print(var,'Python')
returnFalse
res=fuc('Hello')
print(res)
装饰带万能参数的函数装饰器
importtime
defwrapper(f):#装饰器函数
definner(*args,**kwargs):
start=time.time()
ret=f(*args,**kwargs)
end=time.time()
print(end-start)
returnret
returninner
@wrapper#相当于fuc=wrapper(fuc)
deffuc(a,b,c,d,e=5):#被装饰的函数
time.sleep(0.5)
print(a,b,c,d,e)
returne
print(fuc(1,2,3,4,'Python'))
总结:装饰器的模板
importtime
defwrapper(f):
definner(*args,**kwargs):
#在被装饰函数之前要做的事
res=f(*args,**kwargs)
#在被装饰函数之后要做的事
returnres
returninner
@wrapper
#func=wrapper(func)
deffunc():#被装饰的函数
return
ret=func()
print(ret)
查看函数信息的方法
deffuc(var):
'0123456789'
print(var,'Python')
returnFalse
print(fuc.__name__)#fuc主要用于查看函数名
print(fuc.__doc__)#0123456789主要用于查看函数的注释
我们在使用fuc()函数的时候实际上我们调用的是inner()函数,如果我们要在不修改原函数的前提下拿到原函数的信息,只需要将inner()函数变成一个装饰器:
defwrapper(f):
definner(*args,**kwargs):
ret=f(*args,**kwargs)
returnret
returninner
@wrapper
deffuc():
print('Python')
returnTrue
print(fuc())
print(fuc.__name__)#inner这里调用的是inner函数
修改后:
fromfunctoolsimportwraps
defwrapper(f):
@wraps(f)
definner(*args,**kwargs):
ret=f(*args,**kwargs)
returnret
returninner
@wrapper
deffuc():
print('Python')
returnTrue
print(fuc())
print(fuc.__name__)#fuc这里就改回调用的函数名是fuc
带参数的装饰器
如果许多函数都使用了同一个装饰器,那么它将需要一个布尔值作为参数来作为开关控制它们的使用
FLAGE=False
defwrapper_ctrl(flag):
defwrapper(fuc):
definner(*args,**kwargs):
ifflag:
print('装饰器已开启...')
ret=fuc()
returnret
else:
print('装饰器已关闭...')
returninner
returnwrapper
@wrapper_ctrl(FLAGE)
deffunction1():
print('aaaaaaa')
@wrapper_ctrl(FLAGE)
deffunction2():
print('bbbbbbb')
@wrapper_ctrl(FLAGE)
deffunction3():
print('ccccccc')
function1()#装饰器已关闭...
function2()#装饰器已关闭...
function3()#装饰器已关闭...
多个装饰器装饰一个函数
defwrapper1(fuc):#2Step:fuc->f
definner1(*args,**kwargs):
print('wrapper1在装饰该函数前要做的事...')#12Step:print
fuc(*args,**kwargs)#13Step:这里的fuc就是f因为第二步已经传进来了
print('wrapper1在装饰该函数后要做的事...')#15Step:print
returninner1#3Step:传回inner1
defwrapper2(fuc):#6Step:fuc->inner1
definner2(*args,**kwargs):
print('wrapper2在装饰该函数前要做的事...')#10Step:print
fuc(*args,**kwargs)#11Step:这里的fuc()实际上是inner1()
print('wrapper2在装饰该函数后要做的事...')#16Step:print
returninner2#7Step:返回inner2
@wrapper2#5Step:f=wrapper2(f)这里的f是inner1即f=wrapper2(inner1)
#8Step:f=inner2
@wrapper1#1Step:f=wrapper1(f)
#4Step:f=inner1
#装饰器会找离它最近的函数离这个函数最近的装饰器会先执行
deff():
print('abcdefg')#14Step:print
f()#9Step:这里调用的f()实际上是inner2()
'''执行结果'''
#wrapper2在装饰该函数前要做的事...
#wrapper1在装饰该函数前要做的事...
#abcdefg
#wrapper1在装饰该函数后要做的事...
#wrapper2在装饰该函数后要做的事...
流程图:
3.和装饰器相关的案例
a.编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需输入用户名和密码
FLAG=False
deflogin(f):
definner(*args,**kwargs):
globalFLAG
ifFLAG:#如果已经登入成功
f(*args,**kwargs)
else:
username=input('请输入用户名:')
password=input('请输入密码:')
ifusername.strip()=='JANE'andpassword.strip()=='123456':
FLAG=True
print('登入成功!')
f(*args,**kwargs)
else:
print('登入失败!')
returninner
get_name('JANE')
get_ID()
b.编写装饰器,为多个函数加上记录调用功能,要求每次调用函数都将把被调用的函数写入文件
deflog(f):
definner(*args,**kwargs):
withopen('log.txt',mode='a',encoding='utf-8')asfileStream:
fileStream.write(f.__name__+'\n')
f(*args,**kwargs)
returninner
@log
defget_name():
print('YourusernameisJANE')
@log
defget_ID():
print('YouruserIDis110123')
get_ID()
get_name()
get_ID()
c.编写下载网页的函数,要求功能是:用户传入一个url,函数返回下载页面的结果
fromurllib.requestimporturlopen
defget(url):
html=urlopen(url).read()
returnhtml
ret=get('http://www.baidu.com')
print(ret)
#<boundmethodHTTPResponse.readof<http.client.HTTPResponseobjectat0x00000000073BC860>>
d.为c编写装饰器,实现缓存网页内容的功能,主要功能:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则就去下载,然后存到文件中
importos
fromurllib.requestimporturlopen
defcache(func):
definner(*args,**kwargs):
ifos.path.getsize('web_cache'):#如果不为0就是True从文件中找到源码
withopen('web_cache','rb')asf:
returnf.read()
ret=func(*args,**kwargs)#取得网页的源码
withopen('web_cache','wb')asf:
f.write(b'*******'+ret)#若文件没有网页源码则写入新标志和源码
returnret
returninner
@cache
defget(url):
code=urlopen(url).read()
returncode
end=get('http://www.baidu.com')
print(end)
end=get('http://www.baidu.com')
print(end)
end=get('http://www.baidu.com')
print(end)
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h54901.shtml