首页 > 其他分享 >多层语法糖、有参装饰器、及递归函数

多层语法糖、有参装饰器、及递归函数

时间:2022-10-12 21:25:37浏览次数:46  
标签:index return name 递归函数 多层 语法 func print def

多层语法糖、有参装饰器、及递归函数

目录

一、多层语法糖

1.语法糖会将下面紧挨着的名字传给@后面得函数并调用
2.从下到上加载,从上到下执行
3.最上层的语法糖做重命名操作
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')
图片名称

二、有参装饰器

# 当装饰器需要额外的参数时,我们可以用有参装饰器
def outter(mode):                  # '1'会被形参mode接收
    def login_auth(func_name):
        def inner(*args,**kwargs):
            username = input('请输入您的用户名').strip()
            password = input('请输入您的密码').strip()
            if mode == '1':
                print('用户名和密码是写死的')
            elif mode == '2':
                print('数据来源于文本文件')
            elif mode == '3':
                print('数据来源于字典')
            elif mode == '4':
                print('数据来源于数据库mysql')
        return inner()
    return login_auth()

@outter('1')        # 函数名加括号执行的优先级最高
def index():
    print('from index')
index()
# 函数名加括号执行优先级最高,先执行函数名加括号的操作,再是语法糖
@outter('2')
def func():
    print('from func')
func()
# 为装饰器里面传递更多的参数
图片名称

三、装饰器模板

1.最常用的装饰器模板
    def outter(func_name):
        def inner(*args,**kwargs):
            res  = func_name(*args,**kwargs)
            return res
        return inner
    @outter
    def index():
        print('index')
    index()
2.不常用的装饰器模板
    def outter1(mode)
        def outter(func_name):
            def inner(*args,**kwargs):
                res  = func_name(*args,**kwargs)
                return res
            return inner
        return outter
    @outter1('1')
    def index():
        print('index')
    index()

四、装饰器修复技术

def index():
    pass
help(index)   # index()    Help on built-in function len in module builtins:
help(len)    #  len(obj, /)   Return the number of items in a container.
# 为了让装饰器的效果更逼真,用下面的方法
from functools import wraps
def outter(func_name):
    @wraps(func_name)
    def inner(*args,**kwargs):
        '''我是谁'''
        res = func_name(*args,**kwargs)
        return res
    return inner

@outter
def index():
    '''不知道吧'''
    #print('index')
index()

五、递归函数

1.函数的递归调用
 函数直接或者间接的调用了函数自身
 # 直接调用
    def index():
        print('from index')    # 重复执行,直到查询到死循环报错
        index()
    index()
 # 间接调用
def index():           # 第一步
    print('from index')   # 六  十....
    func()                # 七   十一.....
def func():           # 第二步
    print('from func')  # 四  八......
    index()             # 五  九.......
func()                 # 第三步
# python 中允许的最大递归调用的次数
# 官网提供的最大递归深度为1000 我们在测试的时候可能会出现996 997 998
 count = 0
 def index():
    global count
    count += 1
    print(count)
    index()
 index()
2.递归函数
     1.直接或者间接调用自己
     2.每次调用都比上次简单
       递推:一层层往下
       回溯:基于明确结果一层层往上

六、昨日作业详解

is_login = False
def login_auth(func_name):
    def inner(*args,**kwargs):
        global is_login
        # 先判断全局名称空间中的变量名is_login绑定的值是否为True
        if is_login:
            res = func_name(*args, **kwargs)
            return res
        username = input('请输入您的用户名').strip()
        pwd = input('请输入您的密码').strip()
        if username == 'jason' and pwd == '123':
            # 将全局名称空间中记录用户登录状态数据值为True
            is_login = True
            res = func_name(*args, **kwargs)
            return res
        else:
            print('用户名或者密码有误')
    return inner
@login_auth
def register():
    print('注册')
@login_auth
def login():
    print('登录')
@login_auth
def shopping():
    print('购物')
register()
login()
shopping()

七、今日作业

1.利用递归函数依次打印列表中每一个数据值
	l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
def data_list(datas):
    for i in datas:
        if isinstance(i, list):   # 判断当前数据是不是列表
            data_list(i)          # 是的话,进行递归调用
        print(i,type(i))
data_list(l1)
# isinstance在Python中的意思是‘判断类型’,用于判断一个对象是不是一个一直的类型,类似于type()
# isinstance(object, classinfo) object是实例对象,classinfo可以是他们的类名
图片名称
2.利用有参装饰器编写多种用户登录校验策略
print('''
    1.用户名和密码是写死的
    2.数据来源于文本文件
    3.数据来源于字典
''')
choice = input('请输入您要操作的编号').strip()
def login_auth(mode):
    def outter(func_name):
        def inner(*args, **kwargs):
            username = input('请输入您的用户名').strip()
            password = input('请输入您的密码').strip()
            if mode == '1':
                # print('用户名和密码是写死的')
                if username == 'jason' and password == '123':
                    res = func_name(*args, **kwargs)
                    return res
                print('用户名或者密码有误')
            elif mode == '2':
                # print('数据来源于文本文件')
                with open(r'a.txt', 'r',encoding='utf8') as f:
                    data = f.read()
                name, pwd = data.split('|')
                if name == username and pwd == password:
                    res2 = func_name(*args, **kwargs)
                    return res2
                # print('操作失败')
            elif mode == '3':
                # print('数据来源于字典')
                data = {'name':'jason','pwd':'111'}
                name =data['name']        # 注意两个的位置排布
                pwd = data['pwd']
                if username == name and password == pwd:
                    res1 = func_name(*args, **kwargs)
                    return res1
                print('操作失败')
        return inner
    return outter
@login_auth(choice)
def index():
    print('操作成功')
index()
图片名称 图片名称 图片名称

标签:index,return,name,递归函数,多层,语法,func,print,def
From: https://www.cnblogs.com/zx0524/p/16786047.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......
  • 多层语法糖、装饰器、递归函数
    多层语法糖、装饰器、递归函数目录多层语法糖、装饰器、递归函数一、多层语法糖二、有参装饰器三、装饰器模板1、最常用的无参装饰器2、不常用的有参装饰器四、装饰器修复......
  • Java基础语法 数组的默认初始化值
    默认初始化值packagecom.ljg.java;/**⑤数组元素的默认初始化值* >数组元素是整型:0* >数组元素是浮点型:0.0* >数组元素是char型:0或'\u0000',而非'0'......
  • 装饰器、递归函数,语法糖
    目录作业讲解多层语法糖问题有参装饰器装饰器模版装饰器修复技术递归函数作业作业讲解1.编写一个用户认证装饰器函数:registerlogintransferwithdraw基本要求......
  • day13装饰器以及递归函数
    目录今日内容概要今日内容详细多层语法糖有参装饰器装饰器模板null装饰器修复技术递归函数作业今日内容概要多层语法糖问题有参装饰器装饰器修复技术递归函数今......
  • 杂谈:我为啥不喜欢用新语法不喜欢用动态语句
    最近接手的代码,怎么说呢?原作者水平肯定是有的,而且很高。但是明显的一个感觉就是他特别喜欢用动态语句。喜欢用一些新语法。后来的一些改动,比较大的时候我直接就把动......
  • 装饰器的补充与递归函数
    多层语法糖defoutter1(func1):print('加载了outter1')defwrapper1(*args,**kwargs):print('执行了wrapper1')res1=func1(*args,**kwarg......