• 【Python基础之函数:多层语法糖、装饰器和装饰器修复技术及递归函数】


    🤵‍♂️ 个人主页@老虎也淘气 个人主页
    ✍🏻作者简介:Python学习
    🐋 希望大家多多支持我们一起进步!😄
    如果文章对你有帮助的话,
    欢迎评论 💬点赞👍🏻 收藏 📂加关注

    一、多层语法糖

    1、什么是多层语法糖:

    ​ 多层语法糖是指在单个源代码函数名上方添加了多个语法糖,使这段源代码函数体具备多个功能

    2、多层语法糖用法:

    ​ 首先定义好装饰器功能,将需要添加功能的函数体代码放置在装饰器下方,将需要执行功能的装饰器语法糖按照执行的顺序防在原函数体函数名上方,多层语法糖加载顺序由下往上

    代码用法:

    def outter1(func1):
        print('加载了outter1')
        def wrapper1(*args, **kwargs):
            print('执行了wrapper1')
            res1 = func1(*args, **kwargs)
            return res1
        return wrapper1
    
    def outter2(func2):
        print('加载了outter2')
        def wrapper2(*args, **kwargs):
            print('执行了wrapper2')
            res2 = func2(*args, **kwargs)
            return res2
        return wrapper2
    
    def outter3(func3):
        print('加载了outter3')
        def wrapper3(*args, **kwargs):
            print('执行了wrapper3')
            res3 = func3(*args, **kwargs)
            return res3
        return wrapper3
    
    
    @outter1
    @outter2
    @outter3
    def index():
        print('from index')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述

    二、有参装饰器

    1、什么是有参装饰器:

    ​ 有参装饰器是指在无参装饰器的基础的函数体外层再加上一层函数

    2、有参装饰器的作用:

    ​ 当无参函数体内需要局部名称需要外部传参时,我们就可以再有参装饰器函数名后方参数内进行传参

    有参装饰器模板:

    def 有参装饰器(x,y,z):
        def outter(func):
            def wrapper(*args, **kwargs):
                res = func(*args, **kwargs)
                return res
            return wrapper
        return outter
    
    @有参装饰器(1,y=2,z=3)
    def 被装饰对象():
        pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    有参装饰器实战用法:

    def auth(db_type):
        def deco(func):
            def wrapper(*args, **kwargs):
                name = input('your name>>>: ').strip()
                pwd = input('your password>>>: ').strip()
    
                if db_type == 'file':
                    print('基于文件的验证')
                    if name == 'egon' and pwd == '123':
                        res = func(*args, **kwargs)  # index(1,2)
                        return res
                    else:
                        print('user or password error')
                elif db_type == 'mysql':
                    print('基于mysql的验证')
                elif db_type == 'ldap':
                    print('基于ldap的验证')
                else:
                    print('不支持该db_type')
            return wrapper
        return deco
    
    
    @auth(db_type='file')  # @deco # index=deco(index) # index=wrapper
    def index(x, y):
        print('index->>%s:%s' % (x, y))
    
    @auth(db_type='mysql')  # @deco # home=deco(home) # home=wrapper
    def home(name):
        print('home->>%s' % name)
    
    
    @auth(db_type='ldap')  # 账号密码的来源是ldap
    def transfer():
        print('transfer')
    
    # index(1, 2)
    # home('egon')
    # transfer()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    三、装饰器修复技术

    1、什么是装饰器修复技术:

    ​ 装饰器修复技术是指,虽然我们再使用装饰器时,可以通过不改变源代码的调用方式和代码能够执行了新的功能,但我们调用的源代码函数名地址的用法并不是源代码的地址,这时我们就可以通过使用装饰件修复技术使调用的源文件地址和用法和源文件相同

    代码表现

    1.首先全局中调用装饰器修饰模块
    	from functools import wraps
    2.再闭包函数或装饰器代码提中调用
    	@warps 需要修复的函数名
    
    • 1
    • 2
    • 3
    • 4

    实战用法

    from functools import wraps
    
    
    def outer(func_name):
        @wraps(func_name)
        def inner(*args, **kwargs):
            res = func_name(*args, **kwargs)
            return res
    
        return inner
    
    
    @outer
    def func():
        print('我是func函数体代码')
    
    
    func()
    print(func)
    help(func)
    --------------------------------------------------------------------------
    我是func函数体代码
    <function func at 0x00000217883988B0>
    Help on function func in module __main__:
    
    func()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    四、递归函数

    1、什么是递归函数:

    ​ 1.函数体代码内部调用自己本身函数名

    ​ 2.两个函数体代码内部相互调用对方函数名

    ​ 3.每一次调用能得出一个新的数据值,并且明确了结束时间

    注意事项:

    ​ 1.在递归函数未明确结束条件时,代码会进入死循环,这时会触发python保护机制,这段代码最多可运行1000次左右

    代码表现

    1.直接调用自己本身
        count = 0
    
    
        def func():
            global count
            count += 1
            print(count)
            return func()
    
    
        func()
    
    
    
    2.间接调用:
        count = 0
    
    
        def func():
            global count
            count += 1
            print(count)
            return func1()
    
        def func1():
            print(count)
            return func()
    
    
    
    	func()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    2、递归函数的作用:

    ​ 1.是一种计算过程,可以通过递归函数进行数学运算

    实战用法

    '''
    问:
        小明第一天做了20个俯卧撑
        以后每增加一天就会多做1个
    求:
        小米第100做多少个俯卧撑
    '''
    
    def func(n):
        if n == 100:
            return 20
        return func(n + 1)+1
    
    res = func(1)
    print(res)
    --------------------------------------------------------------------------
    119
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    创意电子学小知识:串联和并联
    【附源码】计算机毕业设计JAVA旅行指南网站
    vue项目实现table表格竖向
    《500强高管谈VE》-以VE ORIENTED管理为目标
    渗透必备:Proxifier玩转代理
    会议信息管理系统SSM记录(六)
    如何通过实际操作来加深对Linux命令和概念的理解?
    【ASP.NET Core】MVC模型绑定:自定义InputFormatter读取CSV内容
    视频实现输入密码才能观看的应用效果
    基于JavaSwing开发数字识别系统+PPT+系统文档 课程设计 大作业源码
  • 原文地址:https://blog.csdn.net/m0_66106755/article/details/127811065