生成式、匿名函数、有参装饰器、叠加多个装饰器
1.叠加多个装饰器
1. 加载顺序(outter函数的调用顺序):自下而上
2. 执行顺序(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 # outter1(wrapper2的内存地址)======>index=wrapper1的内存地址 @outter2 # outter2(wrapper3的内存地址)======>wrapper2的内存地址 @outter3 # outter3(最原始的那个index的内存地址)===>wrapper3的内存地址 def index(): print('from index') print('======================================================') index()
2.有参装饰器
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('不知道engine') return wrapper return outter @auth('ldap') #@outter #index=outter(index) # index=wrapper def index(): time.sleep(1) print('from index') @auth('mysql') #@outter # home=outter(home) #home=wrapper def home(name): print('welcome %s' %name) index() home('egon')
3.三元表达式
#原本代码: def max2(x,y): if x > y: return x else: return y res=max2(10,20) 三元表达式: res=x if x > y else y print(res)
4.生成式
列表生成式:
#列表生成式: 原本代码: l=[] for i in range(10): if i > 4: l.append(i**2) 列表生成式: l=[i**2 for i in range(10) if i > 4] print(l) 原本代码: names=['egon','alex_sb','kevin_sb','hxx_sb','cxx_sb'] sbs=[] for name in names: if name.endswith('sb'): sbs.append(name) 列表生成式: sbs=[name for name in names if name.endswith('sb')]
字典生成式:
res={i:i**2 for i in range(10) if i > 3} print(res)
5.匿名函数
匿名函数就是只定义了一个函数的内存地址,主要用于临时使用一次的场景
func=lambda x,y:x+y print(func) print(func(1,2)) res=(lambda x,y:x+y)(1,2) print(res)
杜绝秃头!!!