• day20 Python 高阶函数,函数,嵌套,闭包 装饰器


    高阶函数定义

    1.函数接收的参数是一个函数名

    2.函数的返回值是一个函数名

    3.满足上述条件任意一个都可以称之为高阶函数

    一、函数的接收参数是一个函数名

    import time
    def foo():
        time.sleep(3)
        print('name is charon')
    
    def test(func):
        #print(func)
        start_time=time.time()
        func()
        stop_time=time.time()
        print('run time %s' %(stop_time-start_time))
    #foo()
    test(foo)
    
    结果:
    name is charon
    run time 3.0033559799194336
    

     二、函数的返回参数是一个函数名,实现不了这个功能

    import time
    def foo():
        time.sleep(3)
        print('来自foo')
    
    #不修改foo源代码
    #不修改foo调用方式
    
    
    #多运行了一次,不合格
    # def timer(func):
    #     start_time=time.time()
    #     func()
    #     stop_time = time.time()
    #     print('函数运行时间是  %s' % (stop_time-start_time))
    #     return func
    # foo=timer(foo)
    # foo()
    将timmer函数赋值给foo函数,上面return给timmer函数
    
    
    #没有修改被修饰函数的源代码,也没有修改被修饰函数的调用方式,但是也没有为被修饰函数添加新功能
    def timer(func):
        start_time=time.time()
        return func
        stop_time = time.time()
        print('函数运行时间是  %s' % (stop_time-start_time))
    
    foo=timer(foo)
    foo()

     函数嵌套定义

    在def里面又定义了一个def,函数里面定义了一个函数

    def father(name):
        print('from father %s' %name)
        def son():
            name='linhaifeng_1'
            print('我的爸爸是%s' %name)
            def grandson():
                name='linhaifeng_2'
                print('我的爷爷是%s' %name)
            grandson()
        # print(locals())
        son()
    # father('linhaifeng')
    father('linhaifeng')
    
    
    如果:
    我的爸爸是linhaifeng_1
    我的爷爷是linhaifeng_2
    

    闭包定义

    一层一层的

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

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

    1.不修改原函数的源代码

    2.不修改函数的调用方式

    import time
    def timmer(func):#func=test
        def wrapper():
            start_time=time.time()
            #print(func)
            func()#就是在运行test()
            stop_time=time.time()
            print('运行时间是%s' %(stop_time-start_time))
        return wrapper
    @timmer #test=timmer(test)
    def test():
        time.sleep(3)
        print('test函数运行完毕')
    
    #test=timmer(test)
    test()
    # res=timmer(test)  #返回的是wrapper的地址
    # res()  #执行的是wrapper()
    
    # test=timmer(test)  #返回的是wrapper的地址
    # test()  #执行的是wrapper()
    
    #  @timmer  就相当于 test=timmer(test)
    

     加上返回值

    import time
    def timmer(func): #func=test
        def wrapper():
            start_time=time.time()
            res=func() #就是在运行test()
            stop_time = time.time()
            print('运行时间是%s' %(stop_time-start_time))
            return res
        return wrapper
    
    @timmer #test=timmer(test)
    def test():
        time.sleep(3)
        print('test函数运行完毕')
        return '这是test的返回值'
    
    res=test()  #就是在运行wrapper
    print(res)
    
    结果:
    test函数运行完毕
    运行时间是3.001859188079834
    这是test的返回值
    

     加上参数

    import time
    def timmer(func): #func=test1
        def wrapper(*args,**kwargs): #test('linhaifeng',age=18)  args=('linhaifeng')  kwargs={'age':18}  *args,**kwargs:接收任意可变长参数,
            start_time=time.time()
            res=func(*args,**kwargs) #就是在运行test()         func(*('linhaifeng'),**{'age':18})
            stop_time = time.time()
            print('运行时间是%s' %(stop_time-start_time))
            return res
        return wrapper
    
    @timmer #test=timmer(test)
    def test(name,age):
        time.sleep(3)
        print('test函数运行完毕,名字是【%s】 年龄是【%s】' %(name,age))
        return '这是test的返回值'
    
    @timmer
    def test1(name,age,gender):
        time.sleep(1)
        print('test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】' %(name,age,gender))
        return '这是test的返回值'
    
    # res=test('linhaifeng',age=18)  #就是在运行wrapper
    # # print(res)
    # test1('alex',18,'male')
    test('charon',19)
    test1('alex',18,'male')
    
    结果:
    test函数运行完毕,名字是【charon】 年龄是【19】
    运行时间是3.003596305847168
    test1函数运行完毕,名字是【alex】 年龄是【18】 性别【male】
    运行时间是1.0006954669952393
    
    
    
    
    
    加上*,**让怎么来怎么出去
    
    # def test2(name,age,gender): #test2(*('alex',18,'male','x','y'),**{})
    #     #name,age,gender=('alex',18,'male','x','y')
    #     print(name)
    #     print(age)
    #     print(gender)
    #
    # def test1(*args,**kwargs):
    #     test2(*args,**kwargs)  #args=('alex',18,'male','x','y') kwargs={}
    #
    # # test2('alex',18,gender='male')
    #
    # test1('alex',18,'male')
    

     闭包补充解压序列

    l = [10,3,2,3,3,5,31,4]
    a,b,c,d,e,f,g,h=l
    print(a)
    a,*_,c=l
    print(a)
    print(c)
    a,b,*_,c,d = l
    print(a,b,c,d)
    
    结果:
    10
    10
    4
    10 3 31 4
    

     换值

    a=1
    b=2
    x=a
    a=b
    b=x
    print(a,b)
    
    结果:
    2 1
    
    f1 = 1
    f2 = 2
    f1,f2 = f2,f1
    print(f1,f2)
    
    结果:
    2 1
    

     闭包函数为函数加上认证功能

    user_list=[
        {'name':'alex','passwd':'123'},
        {'name':'linhaifeng','passwd':'123'},
        {'name':'wupeiqi','passwd':'123'},
        {'name':'yuanhao','passwd':'123'},
        {'name':'charon','passwd':'123'}
    ]
    
    current_dic={'username':None,'login':False}
    def auth_func(func):
        def wrapper(*args,**kwargs):
            if current_dic['username'] and current_dic['login']:
                res = func(*args,**kwargs)
                return res
            username = input('username is:').strip()
            password = input('password is:').strip()
            for usr_dic in user_list:
                if username == usr_dic['name'] and password == usr_dic['passwd']:
                    current_dic['username'] = username
                    current_dic['login'] = True
                    res = func(*args,**kwargs)
                    return res
            else:
                print('username or password error')
        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, '奶茶', '妹妹', '娃娃'))
    
    print('before-->',current_dic)
    index()
    print('after--->',current_dic)
    home('产品经理')
    
    
    结果:
    before--> {'username': None, 'login': False}
    username is:charon
    password is:123
    欢迎来到京东主页
    after---> {'username': 'charon', 'login': True}
    欢迎回家产品经理
    

     闭包函数为装饰函数加上参数

    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']:
                        res = func(*args, **kwargs)
                        return res
                    username=input('用户名:').strip()
                    passwd=input('密码:').strip()
                    for user_dic in user_list:
                        if username == user_dic['name'] and passwd == user_dic['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') #auth_func=auth(auth_type='filedb')-->@auth_func 附加了一个auth_type  --->index=auth_func(index)
    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,'奶茶','妹妹','娃娃'))
    
    # print('before-->',current_dic)
    # index()
    # print('after--->',current_dic)
    # home('产品经理')
    shopping_car('产品经理')
    
  • 相关阅读:
    6554545555
    484844
    学习资料整理
    word加上尾注之后参考文献下面的横线去除
    数据结构+算法
    python编程
    计算机网络(1)
    数据结构
    数据分析笔试(3)
    数据分析笔试(2)
  • 原文地址:https://www.cnblogs.com/charon2/p/10391148.html
Copyright © 2020-2023  润新知