一、叠加多个装饰器
import time
def timmer(func):
def wrapper():
start_time=time.time()
res=func()
end_time=time.time()
print('time is %s' %(end_time-start_time))
return res
return wrapper
def outer(func):
# func=home
def inner(*args,**kwargs):
name=input('请输入名字:').strip()
pwd=input('请输入密码:').strip()
with open('aaa','r',encoding='utf8')as f:
for line in f:
data=line.strip('
').split(',')
if name == data[0] and pwd == data[1]:
print('login successfully')
break
else:
print('username or password error')
func(*args,**kwargs)
return inner
@timmer
@outer
def home():
time.sleep(1)
print('welcome to home page')
home()
装饰器补充:
def outer(func):
@wraps(func) #把所有属性赋值给wrappr
备注:
装饰器是要写到源函数正上方,一个装饰器写一行
timmer写到上面统计的是下面两个函数执行的时间
timmer写到下面统计的只是源函数执行的时间
结论:
1. 加载顺序(outter函数的调用顺序):自下而上
2. 执行顺序(wrapper函数的执行顺序):自上而下
二、有参装饰器
当装饰器需要传参的时候用有参装饰器
所谓有餐装饰器,就是套用三个函数
所传参数可以是一个,也可以不止一个,多个参数之间用逗号隔开
三、三元表达式
正常的比较函数:
def max2(x,y):
if x > y:
return x
else:
return y
res=max2(10,20)
print(res)
如果用三元表达式:
x=10
y=20
res=x if x > y else y
print(res)
四、生成式
1.列表生成式
正常for循环生成列表:
l=[]
for i in range(10):
if i > 4:
l.append(i**2)
print(l)
列表生成式生成列表:
l=[i**2 for i in range(10) if i > 4]
print(l)
也可以添加各种功能:
names=['egon','alex_sb','kevin_sb','hxx_sb','cxx_sb']
sbs=[name.upper() for name in names if name.endswith('sb')]
2.字典生成式
res={i:i**2 for i in range(10) if i > 3}
print(res)
3.集合生成式
res={i for i in 'hello'}
print(res)
备注:
元组不能用生成式
五、匿名函数
就是之定义了一个函数的内存地址,主要用于临时使用一次的场景
自带ruturn功能,
res=(lambda x,y:x+y)(1,2)
print(res)
一般不会单独用,和别的函数配合使用:
排序:
l=[4,2,3]
l_new=sorted(l,reverse=True)
print(l_new)
salaries={
'egon':3000,
'alex':100000000,
'wupeiqi':10000,
'yuanhao':2000
}
print(sorted(salaries,key=lambda k:salaries[k],reverse=True))