「Python」多层装饰器执行流程 多层装饰器执行流程 有参装饰器 递归函数 算法之二分法

多层装饰器执行流程

def outter1(func1):  # func1=wrapper2函数名
    print('加载了outter1')
    def wrapper1(*args, **kwargs):
        print('执行了wrapper1') #2.执行wrapper1
        res1 = func1(*args, **kwargs)#3.执行wrapper2
        return res1
    return wrapper1
def outter2(func2):  # func2=wrapper3函数名
    print('加载了outter2')
    def wrapper2(*args, **kwargs):
        print('执行了wrapper2')#3.
        res2 = func2(*args, **kwargs)#4. 执行wrapper 3
        return res2
    return wrapper2
def outter3(func3):  # func3=真正的index函数
    print('加载了outter3')
    def wrapper3(*args, **kwargs):
        print('执行了wrapper3')#5.
        res3 = func3(*args, **kwargs)#6.执行wrapper 3
        return res3
    return wrapper3
@outter1  # index = outter1(wrapper2)        index是wrapper1
@outter2  # wrapper2 = outter2(wrapper3)
@outter3  # wrapper3 = outter3(真正的index函数名)
def index():
    print('from index')
index()  #1.执行index()
"""
语法糖的功能
    会自动将下面紧挨着的函数名当做参数传递给@符号后面的函数名(加括号调用)

涉及到多个语法糖装饰一个函数名
    从下往上执行 最有一个语法糖才会做重命名操作 
"""

有参装饰器

def outer(condition,type_user):
    def login_auth(func_name):  # 这里不能再填写其他形参
        def inner(*args, **kwargs):  # 这里不能再填写非被装饰对象所需的参数
            username = input('username>>>:').strip()
            password = input('password>>>:').strip()
            # 应该根据用户的需求执行不同的代码
            if type_user =='jason':print('VIP')
            if condition == '列表':
                print('使用列表作为数据来源 比对用户数据')
            elif condition == '字典':
                print('使用字典作为数据来源 比对用户数据')
            elif condition == '文件':
                print('使用文件作为数据来源 比对用户数据')
            else:
                print('去你妹的 我目前只有上面几种方式')
        return inner
    return login_auth
@outer('文件','jason')
def index():
    print('from index')
index()

递归函数及其应用

概念
	函数直接或者间接调用了自己 >>>: 递归调用

# 递归调用:直接调用
# def index():
#     print('from index')
#     index()
# index()
# 递归调用:间接调用
# def index():
#     print('from index')
#     func()
# def func():
#     print('from func')
#     index()
# func()
"""
python中允许函数最大递归调用的次数
    官方给出的限制是1000 用代码去验证可能会有些许偏差(997 998...)
"""
# count = 1
# def index():
#     print('from index')
#     global count
#     count += 1  # count = count + 1
#     print(count)
#     index()
# index()
# import sys
# print(sys.getrecursionlimit())  # 1000  获取递归最大次数
# sys.setrecursionlimit(2000)  # 自定义最大次数
# print(sys.getrecursionlimit())


"""
递归函数真正的应用场景
    递推:一层层往下寻找答案
    回溯:根据已知条件推导最终结果
递归函数
    1.每次调用的时候都必须要比上一次简单!!!
    2.并且递归函数最终都必须要有一个明确的结束条件!!!
"""
l1 = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, ]]]]]]]]]]
# 循环打印出列表中所有的数字
# 1.for循环l1里面所有的数据值
# 2.判断当前数据值是否是数字 如果是则打印
# 3.如果不是则继续for循环里面所有数据值
# 4.判断当前数据值是否是数字 如果是则打印
# 5.如果不是则继续for循环里面所有数据值
# 6.判断当前数据值是否是数字 如果是则打印

def get_num(l1):
    for i in l1:
        if isinstance(i,int):
            print(i)
        else:
            get_num(i)
get_num(l1)

算法之二分法

算法的定义
算法就是用计算机解决问题的方法

l1 = [11, 23, 32, 45, 65, 78, 90, 123, 432, 467, 567, 687, 765, 876, 999, 1131, 1232]


def get_num(l1, target_num):
    # 添加递归函数的结束条件
    if len(l1) == 0:
        print('不好意思 找不到')
        return
    # 1.先获取数据集中间那个数
    middle_index = len(l1) // 2
    middle_value = l1[middle_index]
    # 2.判断中间的数据值与目标数据值孰大孰小
    if target_num > middle_value:
        # 3.说明要查找的数在数据集右半边  如何截取右半边
        right_l1 = l1[middle_index + 1:]
        # 3.1.获取右半边中间那个数
        # 3.2.与目标数据值对比
        # 3.3.根据大小切割数据集
        # 经过分析得知 应该使用递归函数
        print(right_l1)
        get_num(right_l1, target_num)
    elif target_num < middle_value:
        # 4.说明要查找的数在数据集左半边  如何截取左半边
        left_l1 = l1[:middle_index]
        # 4.1.获取左半边中间那个数
        # 4.2.与目标数据值对比
        # 4.3.根据大小切割数据集
        # 经过分析得知 应该使用递归函数
        print(left_l1)
        get_num(left_l1, target_num)
    else:
        print('找到了', target_num)


# get_num(l1, 999)
get_num(l1, 1000)

"""
二分法缺陷
	1.数据集必须是有序的
	2.查找的数如果在开头或者结尾 那么二分法效率更低!!!
"""

作业

1.尝试编写有参函数将多种用户验证方式整合到其中 直接获取用户数据比对 数据来源于列表 数据来源于文件

2.尝试编写递归函数 推导指定某个人的正确年龄
eg: A B C D E 已知E是18 求A是多少


name = ['E', 'D', 'C', 'B', 'A']
count = 18

def age():
    global count
    for i in name:
        if i == 'A':
            print(count)
        else:
            count += 2

age()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值