• 目录:

    • 多层装饰器

    • 有参装饰器

    • 递归函数

    • 算法之二分法
  • 多层装饰器

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')
  • 有参装饰器

  • 1.在装饰器内部可以切换多种数据来源(传参方式)例如:列表、字典、文件

1.直接在定义阶段运用形参,调用阶段实参临时绑定形参2.内包函数传值3.user_info('列表','kevin')函数名加括号执行优先级最高
def user_info(source, special_user):
    def login_auth(func_name):                       # 无法增加参数
        def inner(*args, **kwargs):                  # 无法增加参数
            username = input('username>>>:').strip()
            password = input('password>>>:').strip()
            # if username == 'jason' and password == '123':
            if special_user == 'kevin':
                print('他是超级VIP')
            if source == '列表':
                print('数据来源于列表')
            elif source == '字典':
                print('数据来源于字典')
            elif source == '文件':
                print('数据来源于文件')
            else:
                print('数据来源不存在')
        return inner
    return login_auth

@user_info('列表','kevin')  # 1,user_info('列表')  2.@login_auth  装饰器操作步骤
def user():
    print('用户信息获取成功')
user()
  • 递归函数

  • 1.定义:函数直接或间接调用自己

1.1递归函数-函数自己调用自己
def func():
    print('哈哈哈哈')
    func()
func()
1.2递归函数-函数间接调用自己
def func():
    print('')
    func1()
def func1():
    print('')
    func()
func()
func1()
1.3.python解释器中最大递归数
1.3.1计算python中最大递归数-计数
count = 0
def func():
    global count  # 局部修改全局
    print('傻笨')
    print(count)
    count += 1
    func()
func(count)     # 995  计算出的最大值是995
1.3.2获取python解释器中最大递归数
import sys
print(sys.getrecursionlimit())    # 1000
1.4.递归函数应用场景
# 递归函数的应用,将列表中的数据依次打印
l1 = [3, 4, [5, 6, [9, 10, [33, 79, [67, 88,  [111, 333, ]]]]]]
def get_num(l1):
    for i in l1:
        if isinstance(i, int):
            print(i)
        else:
            get_num(i)
get_num(l1)
  • 算法之二分法

  • 定义:将有序列表中的数据通过多次取中间值的方法从成千上万的数据中找到目标值(必须是有序数列,目标值在开头或结尾取数麻烦)

l1 = [1, 3, 4, 5, 6, 8, 9, 13, 17, 23, 34, 47, 67, 78, 99, 114]
# 运用二分法取得数据23
# 运用递归函数
def get_value(l1,target_value):
    if len(l1) == 0:
        print('查无此数')
        return
    median_index = len(l1)//2
    median_value = l1[median_index]
    if median_value > target_value:
        left_l1 = l1[:median_index]
        print(left_l1)
        get_value(left_l1, target_value)
    elif median_value < target_value:
        right_l1 = l1[median_index+1:]
        get_value(right_l1, target_value)
        print(right_l1)
    else:
        print('找到了', target_value)

get_value(l1,23)

 作业

1.尝试编写有参函数将多种用户验证方式整合到其中    直接获取用户数据比对     数据来源于列表     数据来源于文件 数据来源直接获取、列表、文件 创建数据列表及文件
l1 = ['jason', '123']
def outer(choice):
    def user_authen(func_name):
        def user(*args, **kwargs):
            username = input('请输入用户姓名>>>:').strip()
            password = input('请输入用户密码>>>:').strip()
            if username =='jason'and password == '123':
                print('验证成功')
            else:
                print('验证失败')
            if choice == '列表':
                if username == l1[0] and password == l1[1]:
                    print('验证成功')
                else:
                    print('用户名或密码错误')
            elif choice == '文件':
                print('从文件数据中验证成功')
                with open(r'a.txt','r',encoding='utf8') as f:
                    data = f.read()
                    name, pwd = data.split("|")
                    if username == name and password == pwd:
                        print('验证成功')
                    else:
                        print('用户名或密码错误')
            else:
                print('验证失败')
            res = func_name(*args, **kwargs)
            return res
        return user
    return user_authen
@outer('列表')
def index():
    print('from index')
@outer('文件')
def func():
    print('from func')
index()
func()
2.尝试编写递归函数
推导指定某个人的正确年龄
eg: A B C D E 已知E是18 求A是多少
已知E = 18 假如E比D小一岁,D比C小一岁,C比B小一岁,B比A小一岁
# 1 E 是18岁 D比E大一岁
# 2 D 18+1 C比D大一岁
# 3 C 19+1 B比C大一岁
# 4 B 20+1 A比B大一岁
# 5 A 21+1
def get_age(n):
result = 18
for i in range(n - 1):
result += 1
print(result)


def get_age_v2(n):
if n == 1:
return 18
return get_age_v2(n - 1) + 1 # 下一个人的年龄+1
age = get_age(5)
print(get_age)

 

 posted on 2022-07-07 08:17  拾荒菇凉  阅读(90)  评论(0)    收藏  举报