首页 > 其他分享 >多层装饰器

多层装饰器

时间:2022-10-12 21:46:14浏览次数:37  
标签:index return args 多层 kwargs print 装饰 def

目录

今日内容概要

  • 多层语法糖
  • 有参装饰器
  • 装饰器模板
  • 装饰器修复技术
  • 递归函数

今日内容详解

多层语法糖

def outter1(func1):  # 1.定义一个函数outter1
    print('加载了outter1')  # 12.打印内容

    def wrapper1(*args, **kwargs):
        print('执行了weapper1')  # 15.打印内容
        res1 = func1(*args, **kwargs) # 16.因为 func1 = wrapper2  所以 func1() = wrapper2 ()
        return res1

    return wrapper1  # 13.获得返回值wrapper1


def outter2(func2):  # 2.定义一个函数outter2
    print('加载了outter2')  # 9.打印内容

    def wrapper2(*args, **kwargs):
        print('执行了weapper2')  # 17. 打印内容
        res2 = func2(*args, **kwargs)  # 18. 因为 func2 = wrapper3 所以 func2() = wrapper3()
        return res2

    return wrapper2  # 10.获得返回值wrapper2


def outter3(func3):  # 3.定义一个函数outter3
    print('加载了outter3')  # 6. 打印内容

    def wrapper3(*args, **kwargs):
        print('执行了wrapper3')  # 19.打印内容
        res3 = func3(*args, **kwargs) # 20. 因为 func3 = 真正的index  所以 func3() = 真正的index()
        return res3

    return wrapper3  # 7.获得返回值wrapper3


@outter1  # 11.调用函数outter1中的函数体代码  index = outter1(wrapper2)>>>:返回值是wrapper1
@outter2  # 8.调用函数outter2中的函数体代码  outter2 = outter2(wrapper3)>>>:返回值是wrapper2
@outter3  # 5.调用函数outter3中的函数体代码  outter3 = outter(真正的index) >>>返回值是wrapper3
def index():  # 4.定义一个函数index
    print('from index') # 21. 打印内容


index()  # 14.将outter返回值给index使用 index()= wrapper1()
    

有参装饰器

'当装饰器中需要额外的参数时>>>:有参装饰器'


def outer(mode):
    def login_auth(func_name):
        def inner(*args,**kwargs):
            username = input('username>>>:').strip()
            password = input("password>>>:").strip()
            if mode == '1':
                print('数据写死')
            elif mode == '2':
                print('数据来源于文本文件')
            elif mode == '3':
                print('数据来源于字典')
            elif mode == '4':
                print('数据来源于数据库')
        return inner
    return login_auth

  
  '''  
  函数名加括号执行优先级最高 有参装饰器的情况 
    先看函数名加括号的执行
    然后再是语法糖的操作
    '''
  
@outer('1')
def index():
    print('hello')
index()


@outer('2')
def func():
    print('world')
func()

装饰器模板

# 最常用的无参装饰器
# def outer(func_name):
#     def inner(*args, **kwargs):
#         res = func_name(*args, **kwargs)
#         return res
#     return inner

# @outer
# def index():
#     pass

# 不常用的有参装饰器
# def outer_plus(mode):
#     def outer(func_name):
#         def inner(*args, **kwargs):
#             res = func_name(*args, **kwargs)
#             return res
#         return inner
#     return outer

# @outer_plus('MySQL')
# def func():
#     pass

装饰器修复技术

from functools import wraps
def outer(func):
    @wraps(func)  # 修复技术就是为了让被装饰对象更加不容易被察觉装饰了
    def inner(*args, **kwargs):
        print('执行函数之前可以添加的额外功能')
        res = func(*args, **kwargs)  # 执行被装饰的函数
        print('执行函数之后可以添加的额外功能')
        return res  # 将被装饰函数执行之后的返回值返回
    return inner

@outer  # index = outer(index)
def index():
    print('from index')
print(index)
help(index)

def home():
    """这是一个home函数"""
    print('from home')
 help(index)
 help(home)
 print(index)
 help(len)

递归函数

递归函数:函数在运行过程中 直接或者间接的调用了自身

官网表示:python默认的最大递归深度为1000次
框架 查看递归最大次数
import sys
获取递归的限制
print(sys.getrecursionlimit())
修改递归限制次数
print(sys.setrecursionlimit(2000))
 定义一个
count = 1
 定义一个函数
def index():
     在局部想要修改全局的不可变类型数据
    global count
     叠加
    count +=1
     打印
    print(count)
    print('from index')
     内部调用函数
    index()
 调用函数
index()
 递归
      1.递推
           一层层往下推导答案(每次递归之后复杂度相较于上一次一定要有所下降)
        2.回溯
            依据最后的结论往后推导出最初需要的答案
        递归一定要有结束条件!!!
        
 
 伪代码:可能无法运行 但是可以表述逻辑
age(5) = age(4) + 2
age(4) = age(3) + 2
age(3) = age(2) + 2
age(2) = age(1) + 2
age(1) = 18

1.递推
一层层往下推导答案(每次递归之后复杂度相较于上一次一定要有所下降)
2.回溯
依据最后的结论往后推导出最初需要的答案
代码运行

定义一个函数 参数用n表示
def get_age(n):
     判断n是否等于1
    if n == 1:
         返回18
        return 18
     返回值 调用函数
    return get_age(n - 1) + 2
 打印 调用函数
print(get_age(3))

标签:index,return,args,多层,kwargs,print,装饰,def
From: https://www.cnblogs.com/zjl248/p/16786201.html

相关文章

  • 多层语法糖、有参装饰器、及递归函数
    多层语法糖、有参装饰器、及递归函数目录多层语法糖、有参装饰器、及递归函数一、多层语法糖二、有参装饰器三、装饰器模板四、装饰器修复技术五、递归函数六、昨日作业详......
  • 多层语法糖,有参装饰器,递归函数
    多层语法糖deffunc1(a1):#1定义了函数func1#14func1(foo2) print('加载了func1')#15加载了func1 deffoo1(*args,**kwargs): print('执行了foo1')......
  • 装饰器补充和递归函数
    装饰器补充和递归函数多层语法糖问题我们在写代码时可能会遇到同一个函数用多个语法糖来装饰,那么他们之间的关系是什么,怎么执行的就需要看一下下面这段代码了defoutter......
  • python基础之多层语法糖、函数递归
    python基础之多层语法糖、函数递归目录一、多层语法糖二、装饰器模版三、装饰器修复技术四、函数的递归调用1.函数的递归调用2.递归函数的定义3.递归函数的特点4.递归函数......
  • 多层语法糖+递归
    今日内容多层语法糖defoutter1(func1):#1先看函数print('加载了outter1')defwrapper1(*args,**kwargs):print('执行力wrapper1')re......
  • python 函数装饰器
    今日内容概要作业讲解多层语法糖问题有参装饰器装饰器修复技术递归函数算法之二分法今日内容详细多层语法糖defoutter1(func1):print('加载了outter1......
  • 多层语法糖、装饰器、递归函数
    多层语法糖、装饰器、递归函数目录多层语法糖、装饰器、递归函数一、多层语法糖二、有参装饰器三、装饰器模板1、最常用的无参装饰器2、不常用的有参装饰器四、装饰器修复......
  • 装饰器、递归函数,语法糖
    目录作业讲解多层语法糖问题有参装饰器装饰器模版装饰器修复技术递归函数作业作业讲解1.编写一个用户认证装饰器函数:registerlogintransferwithdraw基本要求......
  • day13装饰器以及递归函数
    目录今日内容概要今日内容详细多层语法糖有参装饰器装饰器模板null装饰器修复技术递归函数作业今日内容概要多层语法糖问题有参装饰器装饰器修复技术递归函数今......
  • python 装饰器
    参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017451662295584https://blog.csdn.net/zhh763984017/article/details/120072425......