一.装饰器的剩余:
1.def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
@outter
def index():
'''
这是index的函数...
:return:
'''
print('welcome')
index()
print(index.__name__) #查看函数的名字 wrapper
print(index.__doc__) #None 这个查的是wrapper的文档注释
为了尽可能的让wrapper做的和index一模一样(面试可能会用到)
from functools import wraps
def outter(func):
@wraps(func)
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
return res
return wrapper
@outter
def index():
'''
这是index的函数...
:return:
'''
print('welcome')
index()
print(index.__name__) #查看函数的名字 index
print(index.__doc__) #index的文档注释
2.叠加多个装饰器,多个装饰器的加载及运行顺序
叠加多个装饰器:
1.加载顺序 (outter函数的调用顺序)自下而上
2.执行顺序(wrapper函数的执行顺序)自上而下
def outter1(func1):#fun1=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()
结果:
加载了outter3
加载了outter2
加载了outter1
----------------------------------------
执行了wrapper1
执行了wrapper2
执行了wrapper3
from index
import time
def timmer(func):
def wrapper1(*args,**kwargs):
start=time.time()
res1=func1(*args,*kwargs)
stop=time.time()
print('run time is %s' %(stop - start))
return res1
return wrapper1
def outter(func):
def wrapper2(*args,**kwargs):
name=input('your name>>:').strip()
pwd=input('your password>>:').strip()
if name == 'egon' and pwd == '123':
print('认证成功')
res2=func(*args,**kwargs)
return res2
else:
print('账号或密码错误,认证失败!')
return wrapper2
@timmer
@outter
def index():
time.sleep(1)
print('welcome to index page')
index()
解释:先加载outter,然后加载timmer,运行timmer->outter 这个过程统计的时间是index时间加上验证过程的时间
如果换成
@outter
@timmer 先加载timmer,然后加载outter,运行outter->timmer 这个过程统计的时间是index时间
3.有参装饰器
import time
user_name={'name':None}
def auth(engine):
def outter(func):
def wrapper(*args,**kwargs):
if user_name['name'] is not None:
res=func(*args,**kwargs)
return res
name=input('your name>>:').strip()
pwd=input('your password>>:').strip()
if engine == 'file':
#基于file的认证
if name == 'egon' and pwd == '123':
print('login successful')
user_name['name']=name
res = func(*args, **kwargs)
return res
else:
print('user name or pssword error')
elif engine == 'mysql':
# 基于mysql的认证(数据库)
print('基于maql的认证')
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')
def home(name): #@outter #home=outter(home) #home=wrapper
print('welcome %s to home page' %name)
index()
home('egon')
二.
1.三元表达式
x=10
y=20
res=x if x>y else y
print(res)
结果:20
res='ok' if True else 'no'
print(res)
结果:ok
res='ok' if False else 'no'
print(res)
结果:no
2.生成式
#列表生成式
l=[i for i in range(10)]
print(l)
结果:[0,1,2,3,4,5,6,7,8,9]
l=[i**2 for i in range(10) if i>5]
print(l)
结果:[36,49,64,81]
names=['henry_cool','wendy_beautiful','irene_beautiful','sunny_beautiful']
print([name for name in names if name.endswith('ful')])
结果:['wendy_beautiful','irene_beautiful','sunny_beautiful']
#字典生成式
res={i:i**2 for i in range(10) if i>1}
print(res)
结果:{2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
#集合生成式
res={i for i in 'hello'}
print(res)
结果:{'e', 'o', 'l', 'h'} 集合有去重的效果
注意:没有元组生成式
3.匿名函数与内置函数
#匿名函数只定义了一个函数的内存地址,主要用于临时使用一次的场景
res=(lambda x,y:x+y)(1,2)
print(res)
结果:3
可以这样用,但是通常不这样用,一般都是与其它函数混合使用,用一次就结束了
#内置函数
print(max([4,7,55,-23])) #max相当于底层调了一个for循环
salaries={
'egon':3000,
'alex':3000000,
'henry':6666666,
'wendy':33333
}
def func(k):
return salaries[k]
print(max(salaries,key=func))
print(min(salaries,key=func))
结果:henry
wendy
可以见上面函数改成匿名函数
salaries={
'egon':3000,
'alex':3000000,
'henry':6666666,
'wendy':333
}
print(max(salaries,key=lambda k:salaries[k]))
print(min(salaries,key=lambda k:salaries[k]))
排序:sorted
l=[2,4,3,8,7]
l_new=sorted(l)
print(l_new)
#结果:[2,3,4,7,8] 默认从小到大排
l=[2,4,3,8,7]
l_new=sorted(l,reverse=True)
print(l_new)
#结果:[8,7,4,3,2] 从大到小排
salaries={
'egon':3000,
'alex':3000000,
'henry':6666666,
'wendy':333
}
print(sorted(salaries,key=lambda k:salaries[k]))
结果:['wendy', 'egon', 'alex', 'henry'] 工资从小到大排
要想从大到小排:
print(sorted(salaries,key=lambda k:salaries[k],reverse=True))