菜鸟学Python第十二天,,叠加多个装饰器叠加多
菜鸟学Python第十二天,,叠加多个装饰器叠加多
叠加多个装饰器
叠加多个装饰器
加载顺序(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 wrapstag = 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=wrapperdef welcome(): print(‘welcome to XXX bank !‘) @auth(‘file‘)def check(): print(‘查看余额‘)
三元表达式
取代 if …… else……的简单表达方式
# 常规写法x = 1y = 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 condition1for 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)
菜鸟学Python第十二天
评论关闭