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')
- import time
- # 时间统计函数
- def timmer(func):
- def wrapper(*args, **kwargs):
- start = time.time()
- res = func(*args, **kwargs)
- stop = time.time()
- print('run %s' % (stop - start))
- return res
- return wrapper
- # 账户登录验证函数
- def duth(func):
- def wrapper(*args, **kwargs):
- name = input('please input your name:')
- pwd = input('please input your password:')
- if name == 'egom' and pwd == '123':
- print('login successful')
- res = func(*args, **kwargs)
- return res
- else:
- print('your name or password error')
- return wrapper
- @timmer
- @duth
- # 装饰器将下面函数的函数名当做参数, 然后将运行的结果在赋值给原函数 index
- #
- def index():
- time.sleep(1)
- print('from index')
- index()
2, 有参装饰器
- current_user = {'user':None}
- def duth(engine='file'):
- def outter(func):
- def wrapper(*args,**kwargs):
- #确认 current 字典内是否有存在的数据
- if current_user['user'] is not None:
- res = func(*args,**kwargs)
- return res
- name = input('your name :').strip()
- password = input('your password :').strip()
- #基于'file'文件认证
- if engine == 'file':
- if name == 'egon' and password == '123':
- print('login successful')
- current_user['user']=name
- res=func(*args,**kwargs)
- return res
- else:
- print('your name or password error')
- elif engine == 'mysql' :
- print('基于 mysql 认证')
- elif engine == 'ldap' :
- print('基于 ldap 认证')
- else:
- print('hello')
- return wrapper
- return outter
3, 三元表达式
- 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)
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.upper() for name in names if name.endswith('sb')]
字典生成器
- res={
- i:i**2 for i in range(10) if i> 3
- }
- print(res)
- print({
- i for i in 'hello'
- })
5, 匿名函数
来源: http://www.bubuko.com/infodetail-2867580.html