一:叠加多个装饰器
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()
思维导图:
二:有参装饰器
有参装饰器就相当于三层闭包函数,具体示例如下:
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 == 'Grace' 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('Grace')
三:三元表达式
两个数进行比较: def max2(x,y): if x > y: return x else: return y res=max2(10,20) 可以改写成如下三元表达式: x=10 y=20 res=x if x > y else y print(res) 也可以改成Ture或False类型的: res='OK' if False else 'No' print(res)
四:列表生成式
names=['egon','Grace','zd_sb','hxx_sb'] sbs=[] for name in names: if name.endswith('sb'): sbs.append(name) # sbs=[name for name in names if name.endswith('sb')] # print(sbs) print([name for name in names if name.endswith('sb')])
names=['egon','alex_sb','kevin_sb','hxx_sb','cxx_sb'] sbs=[] for name in names: if name.endswith('sb'): sbs.append(name) sbs=[name.upper() for name in names if name.endswith('sb')] print([name.upper() for name in names]) print([name for name in names if name.endswith('sb')])
五:字典生成式
示例: 1. res={i:i**2 for i in range(10) if i > 3} print(res) 2. print({i for i in 'hello'})
六:匿名函数(lambda)
匿名函数就是只定义了一个函数的内存地址,主要用于临时使用一次的场景
func=lambda x,y:x+y print(func) print(func(1,2)) res=(lambda x,y:x+y)(1,2) print(res)
max,min,sorted等函数可以与匿名函数搭配使用。
max及sorted和匿名函数的搭配使用