多层装饰器,有参装饰器,递归函数,算法之二分法

知识点1 多层装饰器

在这里插入图片描述

def deco1(func1):  # func1 = wrapper2
    def wrapper1(*args, **kwargs):
        print('from wrapper1')
        res1 = func1(*args, **kwargs)
        print('end wrapper1')
        return res1
    return wrapper1


def deco2(func2):  # func2=wrapper3
    def wrapper2(*args, **kwargs):
        print('from wrapper2')
        res2 = func2(*args, **kwargs)
        print('end wrapper2')
        return res2
    return wrapper2


def deco3(func3):  # func3=真正的index
    def wrapper3(*args, **kwargs):
        print('from wrapper3')
        res3 = func3(*args, **kwargs)
        print('end wrapper3')
        return res3
    return wrapper3


@deco1  # index = deco1(wrapper2)   index是deco1
@deco2  # wrapper2 = deco2(wrapper3)
@deco3  # wrapper3 = deco3(真正的index)
def index():
    print('from index')


index()

# 结论:
# 多层装饰器的调用顺序:wapper1>>>wrapper2>>>wrapper3>>>index  然后再从wrapper3,wrapper2,wrapper1依次结束
# 最终的打印顺序:from wrapper1   from wrapper2    from wrapper3   from index   end wrapper3   end wrapper2   end wrapper1

知识点2 有参装饰器

# 作用:仅仅是用来传参的
def outer(mode):  # 有参装饰器
    def auth(func):
        def wrapper(*args, **kwargs):
            name = input('name').strip()
            pwd = input('pwd').strip()
            if mode == 'txt':
                print('文本验证')
                if name == 'jason' and pwd == '123':
                    res = func(*args,**kwargs)
                    return res
                else:
                    print('登录失败')
            if mode == 'mysql':
                print('mysql验证')
                if name == 'jason' and pwd == '123':
                    res = func(*args,**kwargs)
                    return res
                else:
                    print('登录失败')
            else:
                print('其他验证方式')
        return wrapper
    return auth


@outer('txt')
def index():
    print('成功')
    
    
index()

知识点3 递归函数

"""
函数的递归调用;函数嵌套调用的一种特殊形式
具体指的是:在调用一个函数的过程中,直接或间接地调用自己,称之为函数地递归调用
其实就是一个循环的过程
"""


def f1():
    print('f1')
    f1()


f1()

# 查看递归调用层级的方法
import sys

print(sys.getrecursionlimit())

# 设置递归调用层级的方法(最好别修改)

sys.setrecursionlimit()


# 函数的递归调用有两个阶段:回溯,递推
def age(n):
    if n == 1:
        return 18
    else:
        return age(n - 1) + 10


res = age(5)
print(res)

# 练习1
l1 = [1, [2, [3, [4, [5, [6]]]]]]


def func(nums):
    for i in nums:
        if type(i) is list:
            func(i)
        else:
            print(i)


func(l1)

知识点4 算法之二分法

l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]


def func1(find_num, num_list):
    if len(num_list) == 0:
        print(f'你要找的数字{find_num}不存在')
        return
    middle_index = len(num_list) // 2
    if find_num < num_list[middle_index]:
        num_list = num_list[:middle_index]
        print(num_list)
        func1(find_num, num_list)
    elif find_num > num_list[middle_index]:
        num_list = num_list[middle_index + 1:]
        print(num_list)
        func1(find_num, num_list)
    else:
        print(f'你找的数字{find_num},找到了')


func1(29, l1)

作业

"""
1.尝试编写有参函数将多种用户验证方式整合到其中
	直接获取用户数据比对
 	数据来源于列表
 	数据来源于文件
2.尝试编写递归函数
	推导指定某个人的正确年龄
    	eg: A B C D E  已知E是18 求A是多少
"""

# 作业1
data_list = ['jason', 111]


# 简单校验用户是否存在的装饰器
def outter(mode):
    def deco(func):
        def wrapper(*args, **kwargs):
            username = input('username').strip()
            if mode == 'list':
                print('列表')
                if username == data_list[0]:
                    print(f'用户{username}已认证')
                    res = func(*args, **kwargs)
                    return res

            elif mode == 'text file':
                with open('data', 'r', encoding='utf8') as f:
                    for line in f:
                        if username == line.strip('\n').split('|')[0]:
                            print(f'用户{username}已认证')
                            res = func(*args, **kwargs)
                            return res
            else:
                print('请传入正确的参数')

        return wrapper

    return deco


# 有参装饰器的调用,一定要传入参数
@outter(mode='text file')
def login():
    print('登录功能')
    while True:
        password = input('password').strip()
        password = int(password)
        if password == data_list[1]:
            print('登录成功')
            break
        else:
            print('请输入正确的密码')


login()


# 作业2
# eg:从E到A年龄差都是10
def age(n):
    if n == 1:
        return 18
    else:
        return age(n - 1) + 10


res = age(5)  # 一共有A,B,C,D,E,5个人,所以n=5
print(res)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值