返回顶部

day20__装饰器&闭包&高阶函数

                                装饰器
装饰器本质就是函数, 为其他函数添加附加功能

# 原则:
# 1.不修改被修饰函数的源代码
# 2.不修改被修饰函数的调用方式

'''
高阶函数定义:
1.函数接收的参数是一个函数名
2.函数的返回值是一个函数名
3.满足上述条件任意一个,都可称之为高阶函数
'''
def foo():
    print('from the foo')

def test(func):
    return func

res=test(foo)
# print(res)
res()

 

函数的闭包    闭包包含函数嵌套

def father(auth_type):
    # print('from father %s' %name)
    def son():
        # name='xxxxx'
        # print('我的爸爸是%s' %name)
        def grandson():
            print('我的爷爷是%s' %auth_type)
        grandson()
    #print(locals())
    son()

father('filedb')

  

装饰器 =  高阶函数 + 函数嵌套 + 闭包

装饰器

 1.基本装饰器

import  time
def timmer(func):
    def wrapper():
        start_time = time.time()
        func()
        stop_time = time.time()
        print('运行时间是%s'%(stop_time - start_time))
    return wrapper

# def test():
#     time.sleep(1)
#     print('test函数执行完毕')
#
# test = timmer(test)    #返回的是wrapper的地址
# test()                 #执行的是wrapper()

@timmer   #test = timmer(test)
def test():
    time.sleep(1)
    print('test函数执行完毕')

test()

#结果:test函数执行完毕
#      运行时间是1.0080018043518066 


#  @timmer  就相当于 test=timmer(test)

 

2.加上返回值

import  time
def timmer(func):
    def wrapper():
        start_time = time.time()
        ret = func()
        stop_time = time.time()
        print('运行时间是%s'%(stop_time - start_time))
        return ret
    return wrapper


@timmer   #test = timmer(test)
def test():
    time.sleep(1)
    print('test函数执行完毕')
    return '1111111111'

rr = test()
print(rr)
#结果
'''
test函数执行完毕
运行时间是1.009007215499878
1111111111
'''

  3.加上参数

import  time
def timmer(func):
    def wrapper(name,age):
        start_time = time.time()
        ret = func(name,age)
        stop_time = time.time()
        print('运行时间是%s'%(stop_time - start_time))
        return ret
    return wrapper


@timmer   #test = timmer(test)
def test(name,age):
    time.sleep(1)
    print('名字是:%s 年纪是:%s'%(name,age))
    return '1111111111'

rr = test('yang',18)
print(rr)

#结果
'''
名字是:yang 年纪是:18
运行时间是1.0000061988830566
1111111111
'''

  

 

4.加多个参数  *args  **kwargs
import  time
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        ret = func(*args,**kwargs)
        stop_time = time.time()
        print('运行时间是%s'%(stop_time - start_time))
        return ret
    return wrapper


@timmer         #test = timmer(test)
def test(name,age,gender):
    time.sleep(1)
    print('名字是:%s 年纪是:%s 性别:%s'%(name,age,gender))
    #print(args)
    return '1111111111'

rr = test('yang',18,gender='nan')
print(rr)

# 结果
'''
名字是:yang 年纪是:18 性别:nan
运行时间是1.0010037422180176
1111111111
'''

  

 5.验证功能装饰器
 
user_list=[
    {'name':'alex','passwd':'123'},
    {'name':'linhaifeng','passwd':'123'},
    {'name':'wupeiqi','passwd':'123'},
    {'name':'yuanhao','passwd':'123'},
]
current_dic={'username':None,'login':False}

def auth_func(func):
    def wrapper(*args,**kwargs):
        if current_dic['username'] and current_dic['login']:
            ret = func(*args,**kwargs)
            return ret
        username = input('用户名:').strip()
        passwd = input('密码:').strip()
        for line in user_list:
            if username == line['name'] and passwd == line['passwd']:
                current_dic['username'] = username
                current_dic['login'] = True
                res = func(*args, **kwargs)
                return res
        else:
            print('账号或密码不对')
    return  wrapper


@auth_func
def index():
    print('欢迎来到京东主页')

@auth_func
def home(name):
    print('欢迎回家%s' %name)

@auth_func
def shopping_car(name):
    print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))

index()
home('产品经理')
shopping_car('产品经理')

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


user_list=[
    {'name':'alex','passwd':'123'},
    {'name':'linhaifeng','passwd':'123'},
    {'name':'wupeiqi','passwd':'123'},
    {'name':'yuanhao','passwd':'123'},
]
current_dic={'username':None,'login':False}


def auth(auth_type='filedb'):
    def auth_func(func):
        def wrapper(*args,**kwargs):
            print('认证类型是', auth_type)
            if auth_type == 'filedb':
                if current_dic['username'] and current_dic['login']:
                    ret = func(*args,**kwargs)
                    return ret
                username = input('用户名:').strip()
                passwd = input('密码:').strip()
                for line in user_list:
                    if username == line['name'] and passwd == line['passwd']:
                        current_dic['username'] = username
                        current_dic['login'] = True
                        res = func(*args, **kwargs)
                        return res
                else:
                    print('账号或密码不对')

            elif auth_type == 'ldap':
                print('鬼才特么会玩')
                res = func(*args, **kwargs)
                return res

            else:
                print('鬼才知道你用的什么认证方式')
                res = func(*args, **kwargs)
                return res


        return  wrapper
    return auth_func


@auth(auth_type='filedb')
def index():
    print('欢迎来到京东主页')

@auth(auth_type='ldap')
def home(name):
    print('欢迎回家%s' %name)

@auth(auth_type='sssssss')
def shopping_car(name):
    print('%s的购物车里有[%s,%s,%s]' %(name,'奶茶','妹妹','娃娃'))

index()
home('产品经理')
shopping_car('产品经理')

  

 

 

 

 

  

 

 

 

 

 

 

 

 





posted on 2018-05-17 12:13  augustyang  阅读(264)  评论(0编辑  收藏  举报

导航