叠加多个装饰器
加载顺序(outer函数的调用顺序):自下而上
执行顺序(wrapper函数的调用顺序):从上到下
# 叠加多个装饰器 # 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()
应用场景:当装饰器函数内除要传入被装饰对象外还要传入其他参数时,就需要用到有参装饰器。
# 实现一个基于函数验证的装饰器,其后台数据存 放方式有多种 ? from functools import wraps tag = 0 ? def auth(engin): # 函数用到除func以外函数,故再套一层函数 def outer(func): @wraps(func) # wraps函数,相当是一个装饰器将原始被装饰对象的name、和注释传给了wrapper函数 def wrapper(*args,**kwargs): global tag # 全局声明,要使用全局中的名字 if tag: # tag 为True 时,即不再需要验证,通过改变全局变量的方式更改tag的值 res = func(*args, **kwargs) return res name = input(‘username:‘).strip() pwd = input(‘password:‘).strip() if engin ==‘file‘: if name == ‘jason‘ and pwd == ‘123‘: print(‘login successful !‘) res = func(*args, **kwargs) tag = 1 # 将tag变为True return res else: print(‘name or password !‘) elif engin ==‘mysql‘: print(‘执行MySQL认证功能‘) elif engin == ‘ldap‘ print(‘执行ldap认证功能‘) else: print(‘输入有误‘) return wrapper return outer @auth(‘file‘) # engine=file,@outer # outer = outer(welcome) # welcome=wrapper def welcome(): print(‘welcome to XXX bank !‘) @auth(‘file‘) def check(): print(‘查看余额‘)
取代 if …… else……的简单表达方式
# 常规写法 x = 1 y = 2 ? if x>y: print(x) else: print(y) ? #三元表达式写法 res = x if x > y else y
注意:只能判断最最基础的if else语句,不适用于elif 语句。
列表生成式
简化新建列表的方法
# 常规用法 l = [] for i in range(10): if i > 4: l.append(i) print(l) # [5,6,7,8,9] ? # 生成式写法 l = [i for i in range(10) if i>4] print(l) # [5,6,7,8,9] ? ? ? #列表生成式的强大用法(睁大眼睛看着哦) msg = [‘Jason‘, ‘l_tony‘, ‘l_rose‘, ‘l_allen‘] # 提取列表中以‘l‘开头的元素放入列表,并大写 res = [i.upper() for i in msg if i.startswith(‘l‘)] # 一行代码解决 print(res) # [‘L_TONY‘, ‘L_ROSE‘, ‘L_ALLEN‘] ? ? #语法表达式 [expression for item1 in iterable1 if condition1 for item2 in iterable2 if condition2 ... for itemN in iterableN if conditionN ] # [表达式 循环+条件筛选语句]
字典生成式
res = {i: i**2 for i in range(10) if i > 3} print(res) # 字典生成式 ? ? print({i for i in ‘hello‘}) # 集合生成式
匿名函数(lambda)
用匿名函数只定义了一个函数的内存地址,主要用于临时使用一次的场景
内置函数
max:max(* args , key= none)
# 找出工资最高的那个人 ? salaries = { ‘a‘: 3000, ‘b‘: 100000000, ‘c‘: 10000, ‘d‘: 2000 } ? print(max(salaries,key=lambda k:salaries[k]))
min:用法同max
sorted:排序(从小到大)def sorted(*args,**kwargs)
l = [3,6,2,8,5] l1 = sorted(l) print(l1)
原文:https://www.cnblogs.com/liusijun113/p/10046799.html