首先写一个装饰器,对闭包进行修改
import time
def timmer(func):
def wapper():
start_time = time.time()
res = func()
stop_time = time.time()
print('运行时间为%s' %(stop_time - start_time)
return res
return wapper
@timmer
def test():
time.sleep(2)
print('timeout')
return '这是test的返回值'
如果被修饰的函数有参数,可以在调用的函数中加入可变长参数,但是如果只在一个函数中加入可变长参数会报错,比如说在test函数中加入两个参数,但是因为tast运行的是wapper所以wapper中也需要加入参数,之后再func中也需要加入参数,就很麻烦
这里就可以用*args和**kwargs写在传入的变量中,之后运行test时加入参数就可以了:
import time
def timmer(func):
def wapper(*args,**kwargs):
start_time = time.time()
res = func(*args,**kwargs)
stop_time = time.time()
print('运行时间为%s' %(stop_time - start_time))
return res
return wapper
@timmer
def test(name,age):
time.sleep(2)
print('timeout,name is %s,age %s' % (name,age))
return '这是test的返回值'
test('qqq',12)
res = test('yibole',18)
print(res)
当然,语法糖内也是可以传参数进去的,比如说在timmer函数外再包一层函数,然后写一个判断条件是否让该函数运行,这时候在语法糖上加入参数,如果是该参数,则运行一下函数,如果不是该参数则运行其他函数:
user_dick = {'username':None,'login':False}
def waiceng(x = 'nimabi'):
def zhuangshiqi(func):
def wapper(*args,**kwargs):
print('在?kkp',x)
if x == 'nimabi':
if user_dick['username'] and user_dick['login']:
res = func(*args,**kwargs)
return res
username = input('用户名:').strip()
passwd = input('密码:').strip()
if username == 'yibole'and passwd =='123':
user_dick['username'] = username
user_dick['login'] = True
res = func(*args,**kwargs)
return res
else:
print('用户名或密码错误!')
return
else:
print('不在,guna')
return wapper
return zhuangshiqi
@waiceng()
def index():
print('欢迎来到主页')
@waiceng()
def login():
print('登陆成功')
login()
@waiceng(x = 'qqq')
def shopping_car():
print('购物车含有[%s,%s,%s]'%('switch','Ps4','XboxOne'))
index()
login()
shopping_car()
上面这个是一个类似于电子商城的一个登陆的模拟,po啊,你要是忘了你学的东西,可以一定要回头看看喔