装饰器的补充(叠加多个装饰器,有参装饰器,三元表达式,生成式,匿名函数)

Posted 孑乚目分

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装饰器的补充(叠加多个装饰器,有参装饰器,三元表达式,生成式,匿名函数)相关的知识,希望对你有一定的参考价值。

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,匿名函数

 

以上是关于装饰器的补充(叠加多个装饰器,有参装饰器,三元表达式,生成式,匿名函数)的主要内容,如果未能解决你的问题,请参考以下文章

叠加多个装饰器yield表达式三元表达式生成式函数的递归

第十三天 叠加多个装饰器 迭代器 生成器

Python记录11:叠加多个装饰器+有参装饰器

生成器

叠加多个装饰器

叠加装饰器与迭代器