一、疊加多個裝飾器
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('\n').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))