菜鸟学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第十二天

评论关闭