zoukankan      html  css  js  c++  java
  • day20-python之装饰器

    1.装饰器

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import time
     4 def cal(l):
     5     start_time=time.time()
     6     res=0
     7     for i in l:
     8         time.sleep(0.1)
     9         res+=i
    10     stop_time = time.time()
    11     print('函数的运行时间是%s' %(stop_time-start_time))
    12     return res
    13  
    14 
    15 
    16 print(cal(range(100)))
    17 
    18 
    19 def index():
    20     pass
    21 
    22 def home():
    23     pass

    2.装饰器预演

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import time
     4 def timmer(func):
     5     def wrapper(*args,**kwargs):
     6         start_time=time.time()
     7         res=func(*args,**kwargs)
     8         stop_time = time.time()
     9         print('函数运行时间是%s' %(stop_time-start_time))
    10         return res
    11     return wrapper
    12  
    13 def timmer1(func):
    14     def wrapper(*args,**kwargs):
    15         start_time = time.time()
    16         res = func(*args,**kwargs)
    17         stop_time = time.time()
    18         print('函数运行时间是%s' %(stop_time-start_time))
    19         return res
    20     return wrapper()
    21 
    22 
    23 @timmer
    24 def cal(l):
    25     res=0
    26     for i in l:
    27         time.sleep(0.1)
    28         res+=i
    29     return res
    30 
    31 res=cal(range(20))
    32 print(res)
    33 
    34 
    35 def index():
    36     pass
    37 
    38 def home():
    39     pass

    3.高阶函数

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 '''
     4 高阶函数定义:
     5 1.函数接收的参数是一个函数名
     6 2.函数的返回值是一个函数名
     7 3.满足上述条件任意一个,都可称之为高阶函数
     8 '''
     9 # import time
    10 # def foo():
    11 #     time.sleep(3)
    12 #     print('你好啊林师傅')
    13 
    14 # def test(func):
    15 #     # print(func)
    16 #     start_time=time.time()
    17 #     func()
    18 #     stop_time = time.time()
    19 #     print('函数运行时间是  %s' % (stop_time-start_time))
    20 # foo()
    21 # test(foo)
    22 
    23 # def foo():
    24 #     print('from the foo')
    25 # def test(func):
    26 #     return func
    27 # res=test(foo)
    28 # # print(res)
    29 # res()
    30 
    31 
    32 import time
    33 def foo():
    34     time.sleep(3)
    35     print('来自foo')
    36 
    37 #不修改foo源代码
    38 #不修改foo调用方式
    39 
    40 #多运行了一次,不合格
    41 # def timer(func):
    42 #     start_time=time.time()
    43 #     func()
    44 #     stop_time = time.time()
    45 #     print('函数运行时间是  %s' % (stop_time-start_time))
    46 #     return func
    47 # foo=timer(foo)
    48 # foo()
    49 
    50 
    51 #没有修改被修饰函数的源代码,也没有修改被修饰函数的调用方式,但是也没有为被修饰函数添加新功能
    52 # def timer(func):
    53 #     start_time=time.time()
    54 #     return func
    55 #     stop_time = time.time()
    56 #     print('函数运行时间是  %s' % (stop_time-start_time))
    57 #
    58 # foo=timer(foo)
    59 # foo()
    60  

    4.函数嵌套

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 # def bar():
     4 #     print('from bar')
     5 #
     6 # def foo():
     7 #     print('from foo')
     8 #     def test():
     9 #         pass
    10 
    11 def father(auth_type):
    12     # print('from father %s' %name)
    13     def son():
    14         # name='linhaifeng_1'
    15         # print('我的爸爸是%s' %name)
    16         def grandson():
    17             print('我的爷爷是%s' %auth_type)
    18         grandson()
    19     # print(locals())
    20     son()
    21 # father('linhaifeng')
    22 father('filedb')

    5.加上返回值

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import time
     4 def timmer(func): #func=test
     5     def wrapper():
     6         start_time=time.time()
     7         res=func() #就是在运行test()
     8         stop_time = time.time()
     9         print('运行时间是%s' %(stop_time-start_time))
    10         return res
    11     return wrapper
    12 
    13 @timmer #test=timmer(test)
    14 def test():
    15     time.sleep(3)
    16     print('test函数运行完毕')
    17     return '这是test的返回值'
    18 
    19 # res=test()  #就是在运行wrapper
    20 # print(res)

     6.加上参数

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import time
     4 def timmer(func): #func=test1
     5     def wrapper(*args,**kwargs): #test('linhaifeng',age=18)  args=('linhaifeng')  kwargs={'age':18}
     6         start_time=time.time()
     7         res=func(*args,**kwargs) #就是在运行test()         func(*('linhaifeng'),**{'age':18})
     8         stop_time = time.time()
     9         print('运行时间是%s' %(stop_time-start_time))
    10         return res
    11     return wrapper
    12 
    13 
    14 
    15 # @timmer #test=timmer(test)
    16 
    17 def test(name,age):
    18     time.sleep(3)
    19     print('test函数运行完毕,名字是【%s】 年龄是【%s】' %(name,age))
    20     return '这是test的返回值'
    21 
    22 @timmer
    23 def test1(name,age,gender):
    24     time.sleep(1)
    25     print('test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】' %(name,age,gender))
    26     return '这是test的返回值'
    27 
    28 res=test('linhaifeng',age=18)  #就是在运行wrapper
    29 print(res)
    30 # test1('alex',18,'male')
    31 
    32 # test1('alex',18,'male')
    33 
    34 
    35 
    36 
    37 
    38 # def test2(name,age,gender): #test2(*('alex',18,'male','x','y'),**{})
    39 #     #name,age,gender=('alex',18,'male','x','y')
    40 #     print(name)
    41 #     print(age)
    42 #     print(gender)
    43 #
    44 # def test1(*args,**kwargs):
    45 #     test2(*args,**kwargs)  #args=('alex',18,'male','x','y') kwargs={}
    46 #
    47 # # test2('alex',18,gender='male')
    48 #
    49 # test1('alex',18,'male')

    7.装饰器实现

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 import time
     4 def timmer(func): #func=test
     5     def wrapper():
     6         # print(func)
     7         start_time=time.time()
     8         func() #就是在运行test()
     9         stop_time = time.time()
    10         print('运行时间是%s' %(stop_time-start_time))
    11     return wrapper
    12 
    13 @timmer #test=timmer(test)
    14 def test():
    15     time.sleep(3)
    16     print('test函数运行完毕')
    17 test()
    18 
    19 # res=timmer(test)  #返回的是wrapper的地址
    20 # res()  #执行的是wrapper()
    21 
    22 # test=timmer(test)  #返回的是wrapper的地址
    23 # test()  #执行的是wrapper()
    24 
    25 #  @timmer  就相当于 test=timmer(test)

    8.验证功能装饰器

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 user_list=[
     4     {'name':'alex','passwd':'123'},
     5     {'name':'linhaifeng','passwd':'123'},
     6     {'name':'wupeiqi','passwd':'123'},
     7     {'name':'yuanhao','passwd':'123'},
     8 ]
     9 current_dic={'username':None,'login':False}
    10 
    11 
    12 def auth_func(func):
    13     def wrapper(*args,**kwargs):
    14         if current_dic['username'] and current_dic['login']:
    15             res = func(*args, **kwargs)
    16             return res
    17         username=input('用户名:').strip()
    18         passwd=input('密码:').strip()
    19         for user_dic in user_list:
    20             if username == user_dic['name'] and passwd == user_dic['passwd']:
    21                 current_dic['username']=username
    22                 current_dic['login']=True
    23                 res = func(*args, **kwargs)
    24                 return res
    25         else:
    26             print('用户名或者密码错误')
    27 
    28     return wrapper
    29 
    30 @auth_func
    31 def index():
    32     print('欢迎来到京东主页')
    33 
    34 @auth_func
    35 def home(name):
    36     print('欢迎回家%s' %name)
    37 
    38 @auth_func
    39 def shopping_car(name):
    40     print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))
    41 
    42 print('before-->',current_dic)
    43 index()
    44 print('after--->',current_dic)
    45 home('产品经理')
    46 shopping_car('产品经理')

    10.带参数验证功能装饰器

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 user_list=[
     4     {'name':'alex','passwd':'123'},
     5     {'name':'linhaifeng','passwd':'123'},
     6     {'name':'wupeiqi','passwd':'123'},
     7     {'name':'yuanhao','passwd':'123'},
     8 ]
     9 current_dic={'username':None,'login':False}
    10 
    11 def auth(auth_type='filedb'):
    12     def auth_func(func):
    13         def wrapper(*args,**kwargs):
    14             print('认证类型是',auth_type)
    15             if auth_type == 'filedb':
    16                 if current_dic['username'] and current_dic['login']:
    17                     res = func(*args, **kwargs)
    18                     return res
    19                 username=input('用户名:').strip()
    20                 passwd=input('密码:').strip()
    21                 for user_dic in user_list:
    22                     if username == user_dic['name'] and passwd == user_dic['passwd']:
    23                         current_dic['username']=username
    24                         current_dic['login']=True
    25                         res = func(*args, **kwargs)
    26                         return res
    27                 else:
    28                     print('用户名或者密码错误')
    29             elif auth_type == 'ldap':
    30                 print('鬼才特么会玩')
    31                 res = func(*args, **kwargs)
    32                 return res
    33             else:
    34                 print('鬼才知道你用的什么认证方式')
    35                 res = func(*args, **kwargs)
    36                 return res
    37 
    38         return wrapper
    39     return auth_func
    40 
    41 @auth(auth_type='filedb') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type  --->index=auth_func(index)
    42 def index():
    43     print('欢迎来到京东主页')
    44 
    45 @auth(auth_type='ldap')
    46 def home(name):
    47     print('欢迎回家%s' %name)
    48 #
    49 @auth(auth_type='sssssss')
    50 def shopping_car(name):
    51     print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))
    52 
    53 # print('before-->',current_dic)
    54 # index()
    55 print('after--->',current_dic)
    56 home('产品经理')
    57 # shopping_car('产品经理')
  • 相关阅读:
    【BZOJ 1069】【SCOI 2007】最大土地面积 凸包+旋转卡壳
    【POJ 2187】Beauty Contest 凸包+旋转卡壳
    1056: [HAOI2008]排名系统
    1874: [BeiJing2009 WinterCamp]取石子游戏
    1055: [HAOI2008]玩具取名
    2338: [HNOI2011]数矩形
    1060: [ZJOI2007]时态同步
    1054: [HAOI2008]移动玩具
    1053: [HAOI2007]反素数ant
    1052: [HAOI2007]覆盖问题
  • 原文地址:https://www.cnblogs.com/sqy-yyr/p/10880503.html
Copyright © 2011-2022 走看看