装饰器进阶与算法

装饰器进阶与算法

多层装饰器执行流程

1.多重结构装饰器与多重语法糖的使用
def outter1(func1):  
    print('执行到outter1')  
    def inner1(*args,**kwargs):  
        print('被装饰对像result1执行前所打印的对象')  
        result1 = func1(*args,**kwargs)
        print('被装饰对象result1执行后所打印的对象')
        return result1
    return inner1

def outter2(func2):  
    print('执行到outter2')  
    def inner2(*args,**kwargs):
        print('被装饰对像result2执行前所打印的对象')
        result2 = func2(*args,**kwargs)
        print('被装饰对象result2执行后所打印的对象')
        return result2
    return inner2


def outter3(func3):  
    print('执行到outter3')  
    def inner3(*args,**kwargs):
        print('被装饰对像result3执行前所打印的对象')
        result3 = func3(*args,**kwargs)
        print('被装饰对象result3执行后所打印的对象')
        return result3
    return inner3


@outter1  #  index = outter1(outter2)
@outter2  #  outter2 = outter2(outter3)
@outter3  #   outter3 = outter3(index)
def index():  
    print('执行到index')

index()  

image

有参装饰器

1.有参函数,我们首先创建一个函数,加上登录的小功能
def func(user_name):
    def inner(*args,**kwargs):
        name = input('请输入您的用户名>>>:').strip()
        pwd = input('请输入您的密码>>>:').strip()
        if name == 'joseph' and pwd == '321':
            print('登陆成功')
            result = user_name(*args,**kwargs)
            return result
        else:
            print('您输入用户名或密码错误')
    return inner


@func
def index():
    print('通过index打印的值')
index()
2.在这个函数的基础上我们需要一个或多个条件将他变成有参装饰器,通过再给他套一个函数给她里面传别的数据值,我们
假如需要使用的数值在列表,字典或文件中,那么我们就需要先从列表,字典,和文件中取值行对比。 
def outter(stdcall):
    def func(user_name):
        def inner(*args,**kwargs):
            name = input('请输入您的用户名>>>:').strip()
            pwd = input('请输入您的密码>>>:').strip()
            if stdcall == 'list':
                print('调用列表中的数据值进行判断')
                result = user_name(*args,**kwargs)
                return inner
            elif stdcall == 'dict':
                print('调用字典中的数据值进行判断')
                result = user_name(*args,**kwargs)
                return inner
            elif stdcall == 'a.txt':
                print('调用文件中的数据值进行判断')
              	 result = user_name(*args,**kwargs)
               	return inner
            else:
                print('暂无该调用方式')     
        return inner
    return func


@outter('list')
def index():
    print('通过index打印的值')
index()

image

递归函数简介

1.在某些需要在相同类型中的复杂数据需要不断向内部取值直到取到某个值,我们就需要递归函数来取值
2.自己调用自己
def func():
    print('调用了func')
    func()
func()
"""
在递归函数调用时因为是自己调用自己可能会无限调用自己那么就会产生出无限个局部函数名套用局部函数,那么我们如果
没有中止的话可能就会将内存卡崩,所以我们的python就帮我们做了优化一旦我们的递归函数跑过1000左右的次数后就会
自动帮我们报错(数值会有偏差python对数字不太敏感但是后期有模块帮我们优化数字系统)
"""
3.两个函数互相调用
def func():
    print('调用了func')
    index()

def index():
    print('调用了index')
    func()
func()
"""
在我们将两个函数互相调用的情况下,首先是调用了func函数而在func函数中又调用index函数因为两个函数的名称都是
在全局名称空间中所以可以相互调用,还是只能跑100左右的次数就会自动停止
"""
4.定义互相调用次数
count = 1  # 首先做一个简单的计数器
def func():  # 定义一个函数
    print('调用func函数')  # 设置输出值
    global count  # 改变全局变量中的数值
    count += 1  # 简单计数
    print(count)  # 打印次数
    func()  # 自己调用自己
func()  # 运行本函数
"""
调用func函数
997  # 简陋计数
"""
5.使用模块计数与修改递归次数
count = 1
def func():
    print('调用func函数')
    global count
    count += 1
    print(count)
    func()
func()
import sys  # 调用sys模块
print(sys.getrecursionlimit())  # 使用sys模块获取最大递归次数
sys.setrecursionlimit(1314)  # 使用sys模块设置最大递归次数
print(sys.getrecursionlimit())  # 将递归次数打印出来
print(sys.setrecursionlimit())  # 获取设置递归次数后的数值

image

递归函数应用

1.当我们使用递归函数的时候一般都是
我们这个比较简单
从列表中获取所有的数值
我们首先使用for循环取值判断内部是否是数值如果是那么就打印如果不是那么就循环自己直到将列表中的所有数值全部取出
l1 = [1,[2,[3,[4,[5,[6,[7,[8,[9,[10,[11,[12,[13,[14,[15]]]]]]]]]]]]]]]
def func(l1):
    for i in l1:
        if isinstance(i,int):
            print(i)
        else:
            func(i)
func(l1)

image

算法之二分法

image

l2 = [1, 3, 4, 6, 7, 8, 9, 11, 15, 17, 19, 21, 22, 25, 29,
         33, 38, 69, 99, 107, 222, 333, 444, 555, 666, 777, 888, 999]
def get_num(l2,result_num):  # 传参给数值
    if len(l2) == 0:  # 如果找不到就是0那么直接打印找不到
        print('您所寻找到值不存在于本列表中')
        return
    middle_index = len(l2) // 2  # 将整个分为两截
    middle_value = l2[middle_index]
    if result_num > middle_value:  # 判断是否数值在右边
        right_l2 = l2[middle_index + 1:]  # 顾头不顾尾所以需要加上最后一个进行判断
        print(right_l2  # 打印
        get_num(right_l2,result_num)
    elif result_num < middle_value:  # 判断是否在左边
        left_l2 = l2[:middle_index]  # 不需要价值判断
        print(left_l2)
        get_num(left_l2, result_num)
    else:
        print('您寻找的值在本列表中存在', result_num)
get_num(l2,999)
"""
[33, 38, 69, 99, 107, 222, 333, 444, 555, 666, 777, 888, 999]
[444, 555, 666, 777, 888, 999]
[888, 999]
您寻找的值在本列表中存在 999
"""

image
作业一:

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

def outer(choice):
    def func(func_name):
        def inner(*args,**kwargs):
            user_name = input('请输入您的用户名>>>:').strip()
            user_pwd = input('请输入您的密码>>>:').strip()
            if choice == l1:
                for i in l1:
                    if user_name == i and user_pwd == i:
                        print('恭喜您认证成功')
                    else:
                        print('认证失败')
            elif choice == a.txt:
                with open(r'a.txt','r',encoding='utf8') as f:
                    data = f.read()
                    a_user_name,a_user_pwd = data.split('|')
                    if user_name == a_user_name and user_pwd == a_user_pwd:
                        print('恭喜您认证成功')
                    else:
                        print('认证失败')
            return inner
        return func
@outer('l1')
def index():
    print('from index')
index()

作业二:

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


假如说e今年18岁它左边的字母依次各大两岁求a今年多大
l1 = ['a', 'b', 'c', 'd', 'e']
e = 18
l1.reverse()
print((len(l1)))
print(l1)
def func():
    for i in l1:
        global e
        e += 2
        a = e
        print(a)
posted @ 2022-07-06 20:19  Joseph-bright  阅读(34)  评论(0编辑  收藏  举报