装饰器

一.装饰器的剩余:
    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))





原文地址:https://www.cnblogs.com/lizeqian1994/p/10046398.html