• Python装饰器续/三元表达式/匿名函数


    day12

    一、装饰器:

    1、叠加多个装饰器:

    1. 加载顺序(outter函数的调用顺序):自下而上

    1. 执行顺序(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
    ​
    def timmer(func):
        def aaa(*args,**kwargs):
            start=time.time()
            res=func(*args,**kwargs) #最原始那个index的内存地址()
            stop=time.time()
            print('run time is %s' %(stop -start))
            return res
        return aaa
    ​
    def auth(func):
        def bbb(*args,**kwargs):
            name=input('name>>>: ').strip()
            pwd=input('pwd>>>: ').strip()
            if name == 'egon' and pwd == '123':
                print('login successfull')
                res=func(*args,**kwargs)
                return res
            else:
                print('user or pwd error')
        return bbb
    ​
    @timmer
    @auth
    def index():
        time.sleep(1)
        print('from index')
    ​
    index()
    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')

    二、三元表达式和生成式:

    1、三元表达式的基本格式

      (条件成立时的返回值)  if  (条件)   else  (条件不成立时的返回值)

    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)

    2、列表生成式:

      列表生成式:用于快速生成列表,并尽可能的使表达式简洁。

    # 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')]
    # print([name.upper() for name in names])
    # print([name for name in names if name.endswith('sb')])

    3、字典生成式:

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

    # dic = dict.fromkeys(seq,value) seq为要设置字典的键值序列;value为可选参数,用于设置键序列seq的值。
    print({i for i in 'hello'})

    三、匿名函数lambda

      匿名函数的格式: lambda 参数:返回值

    # def func():
    #     print('from func')
    #
    # func()
    # func()
    # func()
    # 匿名函数就是只定义了一个函数的内存地址,主要用于临时使用一次的场景

      注:1、匿名函数的精髓就是没有名字的,因此给它赋值是没有意义的;

        2、匿名函数的参数规则、作用域关系与有名函数是一样的;

        3、匿名函数的函数体通常是一个表达式,该表达式必须要有一个返回值。

      匿名函数的实际应用:

    # func=lambda x,y:x+y
    # print(func)
    # print(func(1,2))
    # res=(lambda x,y:x+y)(1,2)
    # print(res)
    ​
    ​
    # print(max([10,11,-3,23]))
    salaries={
        'egon':3000,
        'alex':100000000,
        'wupeiqi':10000,
        'yuanhao':2000
    }
    # def func(k):
    #     return salaries[k]
    # print(max(salaries,key=lambda k:salaries[k]))
    # print(min(salaries,key=func))
    # for循环的结果         比较依据
    # 'egon'                3000
    # 'alex'                100000000
    # 'wupeiqi'             10000
    # 'yuanhao'             2000
    # l=[4,2,3]
    # l_new=sorted(l,reverse=True)
    # print(l_new)
    #print(sorted(salaries,key=lambda k:salaries[k],reverse=True))

     

  • 相关阅读:
    Linux架构
    Python标准库09 当前进程信息 (os包)
    Linux从程序到进程
    Python标准库04 文件管理 (部分os包,shutil包)
    Python标准库10 多进程初步 (multiprocessing包)
    Python标准库06 子进程 (subprocess包)
    绘图: matplotlib Basemap简介
    树莓派与Linux
    绘图: Python matplotlib简介
    Linux进程间通信
  • 原文地址:https://www.cnblogs.com/peng-zhao/p/10046318.html
Copyright © 2020-2023  润新知