day12
一、装饰器:
1、叠加多个装饰器:
-
加载顺序(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 # outter1(wrapper2的内存地址)======>index=wrapper1的内存地址 @outter2 # outter2(wrapper3的内存地址)======>wrapper2的内存地址 @outter3 # outter3(最原始的那个index的内存地址)===>wrapper3的内存地址 def index(): print('from index') print('======================================================') index() 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 @timmer @auth def index(): time.sleep(1) print('from index') 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')
二、三元表达式和生成式:
1、三元表达式的基本格式
(条件成立时的返回值) if (条件) else (条件不成立时的返回值)
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) res='OK' if False else 'No' #三元表达式 print(res)
2、列表生成式:
列表生成式:用于快速生成列表,并尽可能的使表达式简洁。
# 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.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')])
3、字典生成式:
# res={i:i**2 for i in range(10) if i > 3} # print(res)
# dic = dict.fromkeys(seq,value) seq为要设置字典的键值序列;value为可选参数,用于设置键序列seq的值。
print({i for i in 'hello'})
三、匿名函数lambda
匿名函数的格式: lambda 参数:返回值
# def func(): # print('from func') # # func() # func() # func() # 匿名函数就是只定义了一个函数的内存地址,主要用于临时使用一次的场景
注:1、匿名函数的精髓就是没有名字的,因此给它赋值是没有意义的;
2、匿名函数的参数规则、作用域关系与有名函数是一样的;
3、匿名函数的函数体通常是一个表达式,该表达式必须要有一个返回值。
匿名函数的实际应用:
# func=lambda x,y:x+y # print(func) # print(func(1,2)) # res=(lambda x,y:x+y)(1,2) # print(res) # print(max([10,11,-3,23])) salaries={ 'egon':3000, 'alex':100000000, 'wupeiqi':10000, 'yuanhao':2000 } # def func(k): # return salaries[k] # print(max(salaries,key=lambda k:salaries[k])) # print(min(salaries,key=func)) # for循环的结果 比较依据 # 'egon' 3000 # 'alex' 100000000 # 'wupeiqi' 10000 # 'yuanhao' 2000 # l=[4,2,3] # l_new=sorted(l,reverse=True) # print(l_new) #print(sorted(salaries,key=lambda k:salaries[k],reverse=True))