一、叠加多个装饰器
from functools import wraps
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
# wrapper.__name__ = func.__name__
# wrapper.__doc__ = func.__doc__
return wrapper
@outter #index=outter(index) #index=wrapper
def index():
"""
这是index函数....
"""
print('from index')
print(index.__name__)
print(index.__doc__) #查看wrapper函数的注释,和原函数index保持一致
叠加多个装饰器
- 加载顺序(outter函数的调用顺序):自下而上
- 执行顺序(wrapper函数的执行顺序):自上而下
def outter1(func1): # func1=wrapper2的内存地址
print('加载了outter1')
def wrapper1(*args, **kwargs):
print('执行了wrapper1')
res1 = func1(*args, **kwargs)
return res1
return wrapper1
def outter2(func2): # func2=wrapper3的内存地址
print('加载了outter2')
def wrapper2(*args, **kwargs):
print('执行了wrapper2')
res2 = func2(*args, **kwargs)
return res2
return wrapper2
def outter3(func3): # func3=最原始的那个index的内存地址
print('加载了outter3')
def wrapper3(*args, **kwargs):
print('执行了wrapper3')
res3 = func3(*args, **kwargs)
return res3
return wrapper3
@outter1
@outter2
@outter3
def index():
print('from index')
print('=====================')
index()
示范2:
import time
def timmer(func):
def aaa(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs) #最原始那个index的内存地址()
stop=time.time()
print('run time is %s' %(stop -start))
return res
return aaa
def auth(func):
def bbb(*args,**kwargs):
name=input('name>>>: ').strip()
pwd=input('pwd>>>: ').strip()
if name == 'egon' and pwd == '123':
print('login successfull')
res=func(*args,**kwargs)
return res
else:
print('user or pwd error')
return bbb
@auth
@timmer
def index():
time.sleep(1)
print('from index')
index()
二、有参装饰器
import time
current_user={'user':None}
def auth(engine='file'):
def outter(func):
def wrapper(*args,**kwargs):
if current_user['user'] is not None:
res=func(*args,**kwargs)
return res
user=input('username>>>: ').strip()
pwd=input('password>>>: ').strip()
if engine == 'file':
# 基于文件的认证
if user == 'egon' and pwd == '123':
print('login successfull')
current_user['user']=user
res=func(*args,**kwargs)
return res
else:
print('user or password error')
elif engine == 'mysql':
# 基于mysql的认证
print('基于mysql的认证')
elif engine == 'ldap':
# 基于ldap的认证
print('基于ldap的认证')
else:
print('其他')
return wrapper
return outter
@auth('file') #@outter #index=outter(index) # index=wrapper
def index():
time.sleep(1)
print('from index')
@auth('file') #@outter # home=outter(home) #home=wrapper
def home(name):
print('welcome %s' %name)
index()
home('egon')
三、三元表达式
#没使用三元表达式之前
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)
res='OK' if False else 'No'
print(res)
四、生成式
列表生成式
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)
示范1:
names = ['egon','alex_sb','kevin_sb','hxx_sb','cxx_sb']
sbs = []
for name in names:
if name.endswith('sb'):
sbs.append(name)
print(sbs) #['alex_sb', 'kevin_sb', 'hxx_sb', 'cxx_sb']
names = ['egon', 'alex_sb', 'kevin_sb', 'hxx_sb', 'cxx_sb']
sbs = [name for name in names if name.endswith('sb')]
sbs1 = [name.upper() for name in names if name.endswith('sb')]
print(sbs) #['alex_sb', 'kevin_sb', 'hxx_sb', 'cxx_sb']
print(sbs1) #['ALEX_SB', 'KEVIN_SB', 'HXX_SB', 'CXX_SB']
字典生成式
res = {i: i ** 2 for i in range(10) if i > 3}
print(res) #{4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
print({i for i in 'hello'}) #{'l', 'o', 'e', 'h'}
五、匿名函数
匿名函数就是只定义了一个函数的内存地址,主要用于临时使用一次的场景
示范1:
res = (lambda x, y: x + y)(1, 2)
print(res)
示范2:
salaries = {
'egon': 3000,
'alex': 100000000,
'wupeiqi': 10000,
'yuanhao': 2000
}
def func(k):
return salaries[k]
print(max(salaries)) #根据key比较
print(max(salaries,key=lambda k:salaries[k])) #按照value比较
print(min(salaries,key=func))
print(sorted(salaries,key=lambda k:salaries[k],reverse=True))