• 装饰器


    一.装饰器的剩余:
        1.def outter(func):
        def wrapper(*args,**kwargs):
             res=func(*args,**kwargs)
          return res
        return wrapper
      @outter
      def index():
        '''
        这是index的函数...
        :return:
        '''
        print('welcome')
      index()
      print(index.__name__) #查看函数的名字 wrapper
      print(index.__doc__) #None 这个查的是wrapper的文档注释

      为了尽可能的让wrapper做的和index一模一样(面试可能会用到)

      from functools import wraps
      def outter(func):
        @wraps(func)
        def wrapper(*args,**kwargs):
          res=func(*args,**kwargs)
          return res
        return wrapper
      @outter
      def index():
        '''
        这是index的函数...
        :return:
        '''
        print('welcome')
      index()
      print(index.__name__) #查看函数的名字 index
      print(index.__doc__) #index的文档注释

     2.叠加多个装饰器,多个装饰器的加载及运行顺序
      叠加多个装饰器:
      1.加载顺序 (outter函数的调用顺序)自下而上
      2.执行顺序(wrapper函数的执行顺序)自上而下
      def outter1(func1):#fun1=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()
      结果:
      加载了outter3
      加载了outter2
      加载了outter1
      ----------------------------------------
      执行了wrapper1
      执行了wrapper2
      执行了wrapper3
      from index

      import time
      def timmer(func):
        def wrapper1(*args,**kwargs):
          start=time.time()
          res1=func1(*args,*kwargs)
          stop=time.time()
          print('run time is %s' %(stop - start))
          return res1
        return wrapper1
      def outter(func):
        def wrapper2(*args,**kwargs):
          name=input('your name>>:').strip()
          pwd=input('your password>>:').strip()
          if name == 'egon' and pwd == '123':
            print('认证成功')
            res2=func(*args,**kwargs)
            return res2
          else:
            print('账号或密码错误,认证失败!')
        return wrapper2
      @timmer
      @outter
      def index():
        time.sleep(1)
        print('welcome to index page')
      index()
      解释:先加载outter,然后加载timmer,运行timmer->outter 这个过程统计的时间是index时间加上验证过程的时间
      如果换成
      @outter
      @timmer 先加载timmer,然后加载outter,运行outter->timmer 这个过程统计的时间是index时间

     3.有参装饰器
      import time
      user_name={'name':None}
      def auth(engine):
        def outter(func):
          def wrapper(*args,**kwargs):
            if user_name['name'] is not None:
              res=func(*args,**kwargs)
              return res
            name=input('your name>>:').strip()
            pwd=input('your password>>:').strip()
            if engine == 'file':
            #基于file的认证
              if name == 'egon' and pwd == '123':
                print('login successful')
                user_name['name']=name
                res = func(*args, **kwargs)
                return res
              else:
                print('user name or pssword error')
            elif engine == 'mysql':
            # 基于mysql的认证(数据库)
              print('基于maql的认证')
            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')
      def home(name):  #@outter #home=outter(home) #home=wrapper
        print('welcome %s to home page' %name)
      index()
      home('egon')
    二.
     1.三元表达式
      x=10
      y=20
      res=x if x>y else y
      print(res)
      结果:20
      res='ok' if True else 'no'
      print(res)
      结果:ok
      res='ok' if False else 'no'
      print(res)
      结果:no
     2.生成式
      #列表生成式
      l=[i for i in range(10)]
      print(l)
      结果:[0,1,2,3,4,5,6,7,8,9]
      l=[i**2 for i in range(10) if i>5]
      print(l)
      结果:[36,49,64,81]
      names=['henry_cool','wendy_beautiful','irene_beautiful','sunny_beautiful']
      print([name for name in names if name.endswith('ful')])
      结果:['wendy_beautiful','irene_beautiful','sunny_beautiful']
      #字典生成式
      res={i:i**2 for i in range(10) if i>1}
      print(res)
      结果:{2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
      #集合生成式
      res={i for i in 'hello'}
      print(res)
      结果:{'e', 'o', 'l', 'h'} 集合有去重的效果

      注意:没有元组生成式

     3.匿名函数与内置函数
      #匿名函数只定义了一个函数的内存地址,主要用于临时使用一次的场景
      res=(lambda x,y:x+y)(1,2)
      print(res)
      结果:3
      可以这样用,但是通常不这样用,一般都是与其它函数混合使用,用一次就结束了

      #内置函数
      print(max([4,7,55,-23])) #max相当于底层调了一个for循环

      salaries={
      'egon':3000,
      'alex':3000000,
      'henry':6666666,
      'wendy':33333
      }
      def func(k):
        return salaries[k]
      print(max(salaries,key=func))
      print(min(salaries,key=func))
      结果:henry
        wendy
      可以见上面函数改成匿名函数
      salaries={
      'egon':3000,
      'alex':3000000,
      'henry':6666666,
      'wendy':333
      }
      print(max(salaries,key=lambda k:salaries[k]))
      print(min(salaries,key=lambda k:salaries[k]))

      排序:sorted
      l=[2,4,3,8,7]
      l_new=sorted(l)
      print(l_new)
      #结果:[2,3,4,7,8] 默认从小到大排
      l=[2,4,3,8,7]
      l_new=sorted(l,reverse=True)
      print(l_new)
      #结果:[8,7,4,3,2] 从大到小排


      salaries={
      'egon':3000,
      'alex':3000000,
      'henry':6666666,
      'wendy':333
      }
      print(sorted(salaries,key=lambda k:salaries[k]))
      结果:['wendy', 'egon', 'alex', 'henry'] 工资从小到大排
      要想从大到小排:
      print(sorted(salaries,key=lambda k:salaries[k],reverse=True))





  • 相关阅读:
    C#中的转义字符verbatim string
    how to use Inspector in fiddler
    how to use composer in fiddler
    CodeWars上的JavaScript技巧积累
    What's the difference between using “let” and “var” to declare a variable in JavaScript?
    Loop through an array in JavaScript
    Why does typeof array with objects return “Object” and not “Array”?
    Owin and Startup class
    Qt Widgets、QML、Qt Quick的区别
    飞舞的蝴蝶(GraphicsView框架)
  • 原文地址:https://www.cnblogs.com/lizeqian1994/p/10046398.html
Copyright © 2020-2023  润新知