- 本节内容的数据见电脑F:\python数据\Python海量数据(精缩版) 或 百度网盘“我的数据文件/Python海量数据”
一、装饰器与双层装饰器
1.装饰器
def go(func):
print("go up")
func()
print("go down")
@go #这就是一个装饰器,相当于把下面的printdata函数当作go的参数传进去
def printdata():
print("1234")
2.双层装饰器
def come(func):
print("come up")
func()
print("come down")
def go(func):
print("go up")
func()
print("go down")
return func
@come
@go
def printdata():
print("1234")
二、时间装饰器(测试一下某个程序运行花多长时间)
import time
def costTime(func):
starttime=time.time()
func()
endtime=time.time()
print(endtime-starttime)
@costTime #装饰器,这就相当于把下面的go函数当作函数costTime的参数传进去
def go():
num=0
for i in range(100000000):
num+=i
print(num)
三、类装饰器
import time
class costTime: #类装饰器
def __init__(self,func):
starttime = time.time()
func()
endtime = time.time()
print(endtime - starttime)
@costTime #时间装饰器
def go():
num=0
for i in range(100000000):
num+=i
print(num)
三、文件检索
import time
filepath="E:\python数据分析\百度网盘\Python数据分析海量数据营销day2\Python数据分析海量数据营销day2\Search\csdn.txt"
def costTime(func):
starttime=time.time()
func()
endtime=time.time()
print(endtime-starttime)
return costTime,func
def loopGo(args):
costTime, func=args
while True:
costTime(func)
#这就是想让一直执行在磁盘上查询这个程序
def searchMEM(): #这是在内存中检索
csdnfile = open(filepath, "rb")
lines = csdnfile.readlines()
@loopGo #loop等价于loop(costtime(search))
@costTime #等价于costTime(search)
def search():
searchstr = input("Disk输入要查询的字符串")
for line in lines:
line = line.decode("gbk", "ignore")
if line.find(searchstr) != -1:
print(line)
csdnfile.close()
searchMEM()
四、带有参数的装饰器
def toadd(func):
def _toadd():
a=eval(input("data1"))
b = eval(input("data2"))
return func(a,b)
return _toadd() #调用_toadd()函数
@toadd
def add(a,b):
print(a,b)
这个程序就相当于是:
def toadd():
def _toadd():
a=eval(input("data1"))
b = eval(input("data2"))
def add(a,b):
print(a,b)
return add(a,b) #return add(a,b)是属于def _toadd():里面的语句,不是属于def add(a,b)里面的语句啊,这就话就相当于是_toadd()调用了add(a,b)函数
return _toadd() #这就话就相当于是toadd()调用了_toadd()函数
toadd()
五、装饰封装
def toaddplus(func):
def _toadd(*arg): # *arg就是任意参数的意思
print("go up")
func(*arg)
print("go down")
return _toadd #这句话就相当于是toaddplus调用了_toadd(*arg)这个函数
@toaddplus
def add(a,b,c):
print(a,b,c)
return a+b+c
add(1,2,3)
六、装饰器的参数
def show(arg): #arg传递参数的作用
def _show(func): #内置函数
def __show():
print("up",arg)
func()
print("down",arg)
return __show
return _show
@show("gogogo") #"gogogo"和showdata()都作为show的参数传给show
def showdata():
print("show data")
showdata()
例题:
#有磁盘检索和内存检索两种方式,我们用装饰器的知识来看一下
import time
def costTime(args):#仅仅用于传递参数
def _costTime(func):
def __costTime(name):
startime=time.time()
print("start",args)
func(name)
endtime=time.time()
print("end",args)
print(endtime-startime,args)
return __costTime
return _costTime
@costTime("Disk")
def diskseach(name):
time.sleep(5)
print("disksearch", name)
@costTime("MEM")
def memseach(name):
time.sleep(1)
print("memsearch", name)
diskseach("yincheng")
memseach("chenming")