【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')

image.png


二、有参装饰器


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

有参装饰器实战用法:

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、什么是装饰器修复技术:


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


代码表现

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

实战用法

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、什么是递归函数:


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()


2、递归函数的作用:


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

实战用法

'''
问:
    小明第一天做了20个俯卧撑
    以后每增加一天就会多做1个
求:
    小米第100做多少个俯卧撑
'''
def func(n):
    if n == 100:
        return 20
    return func(n + 1)+1
res = func(1)
print(res)
--------------------------------------------------------------------------
119


相关文章
|
10天前
|
API Python
【02】优雅草央央逆向技术篇之逆向接口协议篇-以小红书为例-python逆向小红书将用户名转换获得为uid-优雅草央千澈
【02】优雅草央央逆向技术篇之逆向接口协议篇-以小红书为例-python逆向小红书将用户名转换获得为uid-优雅草央千澈
|
10天前
|
安全 数据挖掘 编译器
【01】优雅草央央逆向技术篇之逆向接口协议篇-如何用python逆向接口协议?python逆向接口协议的原理和步骤-优雅草央千澈
【01】优雅草央央逆向技术篇之逆向接口协议篇-如何用python逆向接口协议?python逆向接口协议的原理和步骤-优雅草央千澈
|
12天前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
25 3
|
16天前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
27 2
|
22天前
|
数据采集 存储 缓存
如何使用缓存技术提升Python爬虫效率
如何使用缓存技术提升Python爬虫效率
|
1天前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
6 0
|
30天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
81 2
|
1月前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
70 8
|
Python
Python|如何用递归解决汉诺塔问题?
Python|如何用递归解决汉诺塔问题?
135 0
|
算法 Python
python递归——汉诺塔
汉诺塔的传说 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。
1234 0