Python学习路程——Day12

Python学习路程——Day12

多层语法糖

'''
多层语法糖 加载顺序由下往上
每次执行之后如果上面还有语法糖 则直接将返回值函数名传给上面的语法糖
如果上面没有语法糖了 则变形 index = outter1(wrapper2)
'''
def outter1(func1):
    print('我是第3个输出的!')
    def inner1(*args, **kwargs):
        print('我是第4个输出的')
        res1 = func1(*args, **kwargs)  # func1 = inner2   res1 接收的返回值是 res2 也是index的 也是None
        print('我是10第个输出的')
        print(res1, '3')
        return res1
    return inner1

def outter2(func2):
    print('我是第2个输出的!')
    def inner2(*args, **kwargs):
        print('我是第5个输出的')
        res2 = func2(*args, **kwargs) # func2 = inner3  res2 的接收返回值 res3 也是index的 也是None
        print('我是第9个输出的')
        print(res2, '2')
        return res2
    return inner2

def outter3(func3): # outter3(index)
    print('我是第1个输出的!') # 1
    def inner3(*args, **kwargs):
        print('我是第6个输出的')
        res3 = func3(*args, **kwargs) #  func3 =index   res3 的返回值是index 为None
        print('我是第8个输出的')
        print(res3, '1')
        return res3
    return inner3

@outter1    #  index = outter1(inner2)    index = outter1(inner2)    index = inner1
@outter2    #  index = outter2(inner3)
@outter3    #  index = outter3(index)
def index():
    print('我是第7个输出的')
    return 1
res = index()
print(res, '4')

输出结果

我是第1个输出的!
我是第2个输出的!
我是第3个输出的!
我是第4个输出的
我是第5个输出的
我是第6个输出的
我是第7个输出的
我是第8个输出的
1 1
我是第9个输出的
1 2
我是10第个输出的
1 3
1 4

有参装饰器

def outter(mode):
    def longin_auth(func_name):
        def inner(*args, **kwargs):
            user_name = input('user_name>>>:').strip()
            pass_word = input('pass_word>>>:').strip()
            if mode == '1':
                print('1')
                res = func_name(*args, *kwargs)
                return res
            elif mode == '2':
                print('2')
                res = func_name(*args, *kwargs)
                return res
            elif mode == '3':
                print('3')
                res = func_name(*args, *kwargs)
                return res
            res = func_name(*args, *kwargs)
            return res
        return inner
    return longin_auth

@outter('1')
def index():
    print('1')
index()

@outter('2')
def func():
    print('2')
func()

@outter('3')
def base():
    print('3')
base()

输出结果

user_name>>>:aaa
pass_word>>>:111
1
1
user_name>>>:333
pass_word>>>:444
2
2
user_name>>>:555
pass_word>>>:666
3
3

有参装饰器模板

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

装饰器修复技术

# 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
    #     count += 1
    #     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) = get_age(2) + 2
    get_age(2) = get_age(1) + 2
    get_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,]]]]]]]]
2.利用有参装饰器编写多种用户登录校验策略
'''
l1 = [1, [2, [3, [4, [5, [6, [7, [8, ]]]]]]]]
def outter(l1):
    for i in l1:
        if type(i) == list:
            outter(i)
        else:
            print(i)
outter(l1)


l2 = [['Maria', '123'], ['jack', '234']]
d1 = {'jason': {'name': 'jason', 'pwd': '123'}, 'kevin': {'name': 'kevin', 'pwd': '234'}}


def outer(a):
    def login_auth(func):
        def inner(*args, **kwargs):
            global l2, d1
            username = input('请输入用户名:').strip()

            # if username in l2:
            #     password = input('请输入密码:').strip()
            #     if a == '1':
            #         if username == 'Tank' and password == '123':
            #             print('登陆成功')
            #             res = func(*args, **kwargs)
            #             return res
            #         print('用户名或密码错误')
            # l2 = set(l2)
            if username in l2[0][0] or username in l2[1][0]:
                password = input('请输入密码:').strip()
                if a == '2':  # 列表
                    for i in l2:
                        if username == i[0] and password == i[1]:
                            print('登陆成功')
                            res = func(*args, **kwargs)
                            return res
                    print('用户名或密码错误')
            elif username in d1:
                password = input('请输入密码:').strip()
                if a == '3':  # 字典
                    if username in d1:
                        b = d1.get(username)
                        name, pwd = b.values()
                        if username == name and password == pwd:
                            print('登陆成功')
                            res = func(*args, **kwargs)
                            return res
                    print('用户名或密码错误')
            # elif a == '4':  # 文件 需要提前创建
            #     with open('text', 'r', encoding='utf8') as f:
            #         for i in f:
            #             name, pwd = i.strip().split('|')
            #             if username == name and password == pwd:
            #                 print('登陆成功')
            #                 res = func(*args, **kwargs)
            #                 return res
            #         print('用户名或密码错误')
            else:
                print('没有')

        return inner

    return login_auth


@outer('3')
def login():
    print('from 字典')


login()


@outer('2')
def login1():
    print('from 列表')


login1()


@outer('1')
def login2():
    print('from 默认')


login2()
posted @ 2022-10-12 23:07  负剑远游行归来仍少年  阅读(30)  评论(0)    收藏  举报