zoukankan      html  css  js  c++  java
  • 生成式、匿名函数、有参装饰器、叠加多个装饰器

    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')
    
    print('======================================================')
    index()
    View Code

    2.有参装饰器

    import time
    
    current_user={'user':None}
    
    def auth(engine='file'):
        def outter(func):
            def wrapper(*args,**kwargs):
                if current_user['user'] is not None:
                    res=func(*args,**kwargs)
                    return res
    
                user=input('username>>>: ').strip()
                pwd=input('password>>>: ').strip()
    
                if engine == 'file':
                    # 基于文件的认证
                    if user == 'egon' and pwd == '123':
                        print('login successfull')
                        current_user['user']=user
                        res=func(*args,**kwargs)
                        return res
                    else:
                        print('user or password error')
                elif engine == 'mysql':
                    # 基于mysql的认证
                    print('基于mysql的认证')
                elif engine == 'ldap':
                    # 基于ldap的认证
                    print('基于ldap的认证')
                else:
                    print('不知道engine')
            return wrapper
        return outter
    
    @auth('ldap') #@outter #index=outter(index) # index=wrapper
    def index():
        time.sleep(1)
        print('from index')
    
    @auth('mysql') #@outter # home=outter(home) #home=wrapper
    def home(name):
        print('welcome %s' %name)
    
    index()
    home('egon')
    View Code

    3.三元表达式

    #原本代码:
    def max2(x,y):
        if x > y:
            return x
        else:
            return y
    
    res=max2(10,20)
    
    
    三元表达式:
    res=x if x > y else y
    print(res)
    View Code

    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 for name in names if name.endswith('sb')]
    View Code

    字典生成式:

    res={i:i**2 for i in range(10) if i > 3}
    print(res)
    View Code

    5.匿名函数

    匿名函数就是只定义了一个函数的内存地址,主要用于临时使用一次的场景

    func=lambda x,y:x+y
    print(func)
    print(func(1,2))
    
    res=(lambda x,y:x+y)(1,2)
    print(res)
    View Code
    杜绝秃头!!!
  • 相关阅读:
    [CTSC2018]暴力写挂
    【bzoj 2870】 最长道路tree
    [CTSC2010]珠宝商
    [JXOI2018]守卫
    [JXOI2018]排序问题
    [AHOI2014/JSOI2014]骑士游戏
    [SNOI2017]遗失的答案
    【LGP5437】【XR-2】约定
    【LGP5349】幂
    hdu-2688 Rotate---树状数组+模拟
  • 原文地址:https://www.cnblogs.com/846617819qq/p/10058461.html
Copyright © 2011-2022 走看看