zoukankan      html  css  js  c++  java
  • 叠加多个装饰器、有参装饰器、三元表达式、列表生成式、字典生成式、匿名函数

    一:叠加多个装饰器

      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()
    叠加多个装饰器

     思维导图:

    二:有参装饰器

      有参装饰器就相当于三层闭包函数,具体示例如下:

    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 == 'Grace' 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('Grace')
    基于某项认证的示例

    三:三元表达式

    两个数进行比较:
    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)
    
    也可以改成Ture或False类型的:
    
    res='OK' if False else 'No'
    print(res)
    三元表达式

    四:列表生成式

    names=['egon','Grace','zd_sb','hxx_sb']
    sbs=[]
    for name in names:
        if name.endswith('sb'):
            sbs.append(name)
    # sbs=[name for name in names if name.endswith('sb')]
    # print(sbs)
    print([name for name in names if name.endswith('sb')])
    列表生成式
    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')]
    
    
    
    print([name.upper() for name in names])
    print([name for name in names if name.endswith('sb')])
    也可以在列表生成式里面加上其他功能

    五:字典生成式

    示例:
    1.
    res={i:i**2 for i in range(10) if i > 3}
    print(res)
    2.
    print({i for i in 'hello'})
    字典生成式

    六:匿名函数(lambda)

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

    func=lambda x,y:x+y
    print(func)
    print(func(1,2))
    
    res=(lambda x,y:x+y)(1,2)
    print(res)
    两数相加

    max,min,sorted等函数可以与匿名函数搭配使用。

    max及sorted和匿名函数的搭配使用
  • 相关阅读:
    【Salesfoece】Apex基础数据类型
    【Javascript】Redux ,Saga关系
    【CSS】选择器
    爬取取百度和Flickr图像
    hadoop系列之一问题锦集
    进行数据清洗_在进行大数据分析之前都需要进行数据清洗,如何进行数据清洗?...
    Hadoop中文编码乱码相关问题
    Can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/
    解决:Multiple annotations found at this line:
    HttpServletRequest cannot be resolved to a type解决方案
  • 原文地址:https://www.cnblogs.com/liuxiaolu/p/10046000.html
Copyright © 2011-2022 走看看