有参装饰器

  • 作业讲解
  • 多层语法糖问题
  • 有参装饰器
  • 递归函数

多层语法糖问题

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')
index()
"""
多层语法糖,加载顺序由下往上
每次执行之后如果上面还有语法糖,则直接将返回值函数传给上面的语法糖
如果上面没有语法糖,则变形index = outter1(wrapper2)
"""

image

有参装饰器

# 校验用户是否登录装饰器
def outer(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')
            res = func_name(*args, **kwargs)
            return res

        return inner
    return login_auth


@outer('1')
def index():
    print('from index')


index()
"""当装饰器中需要额外的参数时>>>有参装饰器"""

"""
函数名加括号执行优先级最高,有参装饰器的情况
	先看函数名加括号的执行
	然后再是语法的操作
"""

装饰器模板

1.无参装饰器
def outer(func):
    def inner(*args, **kwargs):
        res = func(*args, **kwargs)
        return res
    return inner
2.无参装饰器
def outer_pluse(a):
    def outer(func):
        def inner(*args, **kwargs):
            res = func(*args, **kwargs)
            return res
        return inner
    return outer
@outer_pluse('1')
def index():pass
index()

装饰器修复计数

# def index():
#     """index函数 非常的牛"""
#     pass
# help(index)
# help(len)
from functools import wraps
def outer(func_name):
    @wraps(func_name)  # 仅仅是为了让装饰器的效果更加逼真 平时可以不写
    def inner(*args, **kwargs):
        """我是inner 我擅长让人蒙蔽"""
        res = func_name(*args, **kwargs)
        return res
    return inner

@outer
def func():
    """我是真正的func 我很强大 我很牛 我很聪明"""
    pass


# help(func)
# print(func)
func()

递归函数

1.函数的递归调用
	函数直接或者间接的调用了函数自身
    
直接调用
def index():
    print('from index')
    index()
index()
间接调用
def index():
    print('from index')
    func()

def func():
    print('from func')
    index()

func()
"""最大递归深度:python解释器添加的安全措施"""
count = 0
def index():
    global count  # global表示局部count改变全部count
    count += 1  # count+1直接改变全局的count = 0
    print(count)
    index()
index()
"""官网提供的最大递归深度为1000,我们在测试的时候可能会出现996,997,998"""
2.递归函数
	1.直接或者间接调用自己
	2.每次调用都必须比上一次简单,并且需要一个明确的结束条件
    递归:一层层往下
    回溯:基于明确的结果一层层往上
    """
    get_age(5) = get_age(4) + 2
    get_age(4) = get_age(3) + 2
    get_age(3) = gat_age(2) + 2
    gat_age(2) = get_age(1) + 2
    gat_age(1) = 18
    """
    def get_age(n):
        if n == 1:
            return 18
        return get_age(n - 1) + 2
    res = get_age(5)
    print(res)	

作业

1.利用递归函数依次打印列表中每一个数据值
l1 = [1,[2,[3,[4,[5,[6,[7,[8,]]]]]]]]
# for 循环一次拿值
def func(a):
    for i in a:
        if type(i) is int:
            print(i)
        else:
            func(i)


func(l1)
2.
def outer(mode):
    def login_auth(func_name):
        def inner(*args, **kwargs):
            username = input('请输入你的账号>>>:').strip()
            password = input('请输入你的密码>>>:').strip()
            if mode == '1':
                if username == 'jason' and password == '123':
                    res = func_name(*args, **kwargs)
                    return res
                else:
                    print('账号或者密码错误')
            elif mode == '2':
                with open(r'a.txt', 'r', encoding='utf8') as f:
                    for i in f:
                        name, pwd = i.strip().split('|')
                        if username == name and password == pwd:
                            print('登录成功')
                            break
                    else:
                        print('账号或者密码错误')
                        res = func_name(*args, **kwargs)
                        return res
            elif mode == '3':
                name_dict = {'1': {'name': 'li zhi', 'pwd': '123'}, '2': {'name': 'a ning', 'pwd': '123'}}
                for i in name_dict:
                    if username == name_dict.get(i).get('name') and password == name_dict[i]['pwd']:
                        print('登录成功')
                        break
                else:
                    print('账号或者密码错误')
                res = func_name(*args, **kwargs)
                return res

        return inner

    return login_auth


@outer('1')
def index():
    print('form')


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


@outer('3')
def func1():
    print('from')


index()
func()
func1()
posted @ 2022-10-12 19:42  雪语  阅读(41)  评论(0)    收藏  举报