1.装饰器
本质就是函数,功能是为其他函数添加附加功能
原则:
(1)不修改被修饰函数的源代码
(2)不修改被修饰函数的调用方式
import time
def cal(l):
start_time=time.time()
res=0
for i in l:
time.sleep(0.1)
res+=i
stop_time=time.time()
print("函数运行的时间是%s"%(stop_time-start_time))
return res
print(cal(range(20)))
装饰器的知识储备
装饰器=高阶函数+函数嵌套+闭包
#添加装饰器
import time
def timer(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
@timer#原先函数前添加@装饰器名称
def cal(l):
res=0
for i in l:
time.sleep(0.1)
res+=i
return res
print(cal(range(20)))
2.高阶函数
定义:参数是函数或返回值是函数
3.闭包
import time
def timer(func):
def wapper():
print(func)
func()
return wapper
def test():
time.sleep(3)
print('test函数运行完毕')
test=timer(test)
test()
这样就实现了装饰器,但是需要写test=timer(test),再次修改
在需要装饰的函数之前加@装饰器代替test=timer(test)
import time
def timer(func):
def wapper():
print(func)
func()
return wapper
@timer
def test():
time.sleep(3)
print('test函数运行完毕')
test()
添加功能:
import time
def timer(func):
def wapper():
print(func)
start_time=time.time()
func()
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return wapper
@timer
def test():
time.sleep(3)
print('test函数运行完毕')
test()
4.添加返回值
import time
def timer(func):
def wapper():
print(func)
start_time=time.time()
res=func()
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return res
return wapper
@timer
def test():
time.sleep(1.6)
print('test函数运行完毕')
return "这是test的返回值"
print(test())
5.添加传入参数
import time
def timer(func):
def wapper(name,age):
print(func)
start_time=time.time()
res=func(name,age)
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return res
return wapper
@timer
def test(name,age):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s'%(name,age))
return "这是test的返回值"
print(test("liang",18))
@timer
def test1(name,age,gender):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s,性别%s'%(name,age,gender))
return "这是test的返回值"
print(test1("liang",18,'nan'))
同时装饰不同函数时出错,需要改为可变长参数
import time
def timer(func):
def wapper(*args,**kwargs):
print(func)
start_time=time.time()
res=func(*args,**kwargs)
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return res
return wapper
@timer
def test(name,age):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s'%(name,age))
return "这是test的返回值"
print(test("liang",18))
@timer
def test1(name,age,gender):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s,性别%s'%(name,age,gender))
return "这是test1的返回值"
print(test1("liang",18,'nan'))
6.通过解压序列获取列表的第一个和最后一个数据(不通过索引)
l=[10,34,1,45,456,6,7657,567,9]
a,*_,b=l
结果:a=10
b=9
中间不需要的数值放在变量_中
使用索引a,d=l[0],l[-1]
7.变量交换
f1,f2=f2,f1
8.点击所有功能,都添加登录验证,即在原函数上添加装饰器
user_list=[
{'name':'alex','passwd':'123'},
{'name':'lhf','passwd':'123'},
{'name':'wpq','passwd':'123'},
{'name':'yy','passwd':'123'},
]
current_dic={'username':None,'longin':False}
def auth_func(func):
def wrapper(*args,**kwargs):
if current_dic['username'] and current_dic['login']:
res=func(*args,**kwargs)
return res
username=input('用户名:').strip()
passwd=input('密码:').strip()
for usr_dic in user_list:
if username==usr_dic['name'] and passwd==usr_dic['passwd']:
current_dic['username'] = username
current_dic['login'] = True
res = func(*args, **kwargs)
return res
else:#整个遍历完都没找到
print('用户名或密码错误,请重新登录')
return wrapper
@auth_func
def home(name):
print("欢迎回家%s"%name)
@auth_func
def shopping_car(name):
print("%s的购物车里有[%s,%s,%s]"%(name,'奶茶','妹妹','ww'))
@auth_func
def index(name):
print("欢迎来到京东%s"%name)
index('chap')
home('ads')
shopping_car('d')
9.装饰器带参数
def auth(auth_type='filedb')
原先的函数
return auth_func
user_list=[
{'name':'alex','passwd':'123'},
{'name':'lhf','passwd':'123'},
{'name':'wpq','passwd':'123'},
{'name':'yy','passwd':'123'},
]
current_dic={'username':None,'longin':False}
def auth(auth_type='filedb'):
def auth_func(func):
def wrapper(*args,**kwargs):
if auth_type=='filedb':
if current_dic['username'] and current_dic['login']:
res=func(*args,**kwargs)
return res
username=input('用户名:').strip()
passwd=input('密码:').strip()
for usr_dic in user_list:
if username==usr_dic['name'] and passwd==usr_dic['passwd']:
current_dic['username'] = username
current_dic['login'] = True
res = func(*args, **kwargs)
return res
else:#整个遍历完都没找到
print('用户名或密码错误,请重新登录')
if auth_type == 'ldap':
print('使用ldap短信登陆')
return wrapper
return auth_func
@auth(auth_type='ldap')
def home(name):
print("欢迎回家%s"%name)
home('ads')
1.装饰器
本质就是函数,功能是为其他函数添加附加功能
原则:
(1)不修改被修饰函数的源代码
(2)不修改被修饰函数的调用方式
import time
def cal(l):
start_time=time.time()
res=0
for i in l:
time.sleep(0.1)
res+=i
stop_time=time.time()
print("函数运行的时间是%s"%(stop_time-start_time))
return res
print(cal(range(20)))
装饰器的知识储备
装饰器=高阶函数+函数嵌套+闭包
#添加装饰器
import time
def timer(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
@timer#原先函数前添加@装饰器名称
def cal(l):
res=0
for i in l:
time.sleep(0.1)
res+=i
return res
print(cal(range(20)))
2.高阶函数
定义:参数是函数或返回值是函数
3.闭包
import time
def timer(func):
def wapper():
print(func)
func()
return wapper
def test():
time.sleep(3)
print('test函数运行完毕')
test=timer(test)
test()
这样就实现了装饰器,但是需要写test=timer(test),再次修改
在需要装饰的函数之前加@装饰器代替test=timer(test)
import time
def timer(func):
def wapper():
print(func)
func()
return wapper
@timer
def test():
time.sleep(3)
print('test函数运行完毕')
test()
添加功能:
import time
def timer(func):
def wapper():
print(func)
start_time=time.time()
func()
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return wapper
@timer
def test():
time.sleep(3)
print('test函数运行完毕')
test()
4.添加返回值
import time
def timer(func):
def wapper():
print(func)
start_time=time.time()
res=func()
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return res
return wapper
@timer
def test():
time.sleep(1.6)
print('test函数运行完毕')
return "这是test的返回值"
print(test())
5.添加传入参数
import time
def timer(func):
def wapper(name,age):
print(func)
start_time=time.time()
res=func(name,age)
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return res
return wapper
@timer
def test(name,age):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s'%(name,age))
return "这是test的返回值"
print(test("liang",18))
@timer
def test1(name,age,gender):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s,性别%s'%(name,age,gender))
return "这是test的返回值"
print(test1("liang",18,'nan'))
同时装饰不同函数时出错,需要改为可变长参数
import time
def timer(func):
def wapper(*args,**kwargs):
print(func)
start_time=time.time()
res=func(*args,**kwargs)
stop_time = time.time()
print("函数运行时间%s"%(stop_time-start_time))
return res
return wapper
@timer
def test(name,age):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s'%(name,age))
return "这是test的返回值"
print(test("liang",18))
@timer
def test1(name,age,gender):
time.sleep(1.6)
print('test函数运行完毕,名字是%s,年龄是%s,性别%s'%(name,age,gender))
return "这是test1的返回值"
print(test1("liang",18,'nan'))
6.通过解压序列获取列表的第一个和最后一个数据(不通过索引)
l=[10,34,1,45,456,6,7657,567,9]
a,*_,b=l
结果:a=10
b=9
中间不需要的数值放在变量_中
使用索引a,d=l[0],l[-1]
7.变量交换
f1,f2=f2,f1
8.点击所有功能,都添加登录验证,即在原函数上添加装饰器
user_list=[
{'name':'alex','passwd':'123'},
{'name':'lhf','passwd':'123'},
{'name':'wpq','passwd':'123'},
{'name':'yy','passwd':'123'},
]
current_dic={'username':None,'longin':False}
def auth_func(func):
def wrapper(*args,**kwargs):
if current_dic['username'] and current_dic['login']:
res=func(*args,**kwargs)
return res
username=input('用户名:').strip()
passwd=input('密码:').strip()
for usr_dic in user_list:
if username==usr_dic['name'] and passwd==usr_dic['passwd']:
current_dic['username'] = username
current_dic['login'] = True
res = func(*args, **kwargs)
return res
else:#整个遍历完都没找到
print('用户名或密码错误,请重新登录')
return wrapper
@auth_func
def home(name):
print("欢迎回家%s"%name)
@auth_func
def shopping_car(name):
print("%s的购物车里有[%s,%s,%s]"%(name,'奶茶','妹妹','ww'))
@auth_func
def index(name):
print("欢迎来到京东%s"%name)
index('chap')
home('ads')
shopping_car('d')
9.装饰器带参数
def auth(auth_type='filedb')
原先的函数
return auth_func
user_list=[
{'name':'alex','passwd':'123'},
{'name':'lhf','passwd':'123'},
{'name':'wpq','passwd':'123'},
{'name':'yy','passwd':'123'},
]
current_dic={'username':None,'longin':False}
def auth(auth_type='filedb'):
def auth_func(func):
def wrapper(*args,**kwargs):
if auth_type=='filedb':
if current_dic['username'] and current_dic['login']:
res=func(*args,**kwargs)
return res
username=input('用户名:').strip()
passwd=input('密码:').strip()
for usr_dic in user_list:
if username==usr_dic['name'] and passwd==usr_dic['passwd']:
current_dic['username'] = username
current_dic['login'] = True
res = func(*args, **kwargs)
return res
else:#整个遍历完都没找到
print('用户名或密码错误,请重新登录')
if auth_type == 'ldap':
print('使用ldap短信登陆')
return wrapper
return auth_func
@auth(auth_type='ldap')
def home(name):
print("欢迎回家%s"%name)
home('ads')