装饰器补充,递归函数和二分法
装饰器补充
多层语法糖
# 判断print执行顺序
def outer1(func1):
    print('加载了outer1')
    def inner1(*args, **kwargs):
        print('执行了inner1')
        res1 = func1(*args, **kwargs)
        return res1
    return inner1
def outer2(func2):
    print('加载了outer2')
    def inner2(*args, **kwargs):
        print('执行了inner2')
        res2 = func2(*args, **kwargs)
        return res2
    return inner2
def outer3(func3):
    print('加载了outer3')
    def inner3(*args, **kwargs):
        print('执行了inner3')
        res3 = func3(*args, **kwargs)
        return res3
    return inner3
def outer4(func4):
    print('加载了outer4')
    def inner4(*args, **kwargs):
        print('执行了inner4')
        res4 = func4(*args, **kwargs)
        return res4
    return inner4
@outer1  # inner1 = outer1(inner2),inner1指代的函数体代码与普通变量名authentic_func一致
@outer2  # inner2 = outer2(inner3)
@outer3  # inner3 = outer3(inner4)
@outer4  # inner4 = outer4(authentic_func)
def authentic_func():
    print('from authentic_func')
authentic_func()
print(authentic_func)  # <function outer1.<locals>.inner1 at 0x000001ADDFF0E620>

有参装饰器
有参装饰器目的仅是用来给装饰器传递额外的参数
def outer(verification_mode):
    print('loaded outer')
    def login_auth_func(func_name):
        print('loaded login_auth_func')
        def inner(*args, **kwargs):
            username = input(' please enter your username>>>:').strip()
            password = input('please enter your password>>>:').strip()
            if verification_mode == 'list':
                print("verify using a 'list'")
            elif verification_mode == 'dict':
                print("verify using a 'dict'")
            elif verification_mode == 'file':
                print("verify using a 'file'")
            else:
                print('其他验证方式')
                if username == 'admin' and password == 'pwd':
                    print('landed successfully')
            res = func_name(*args, **kwargs)
            return res
        return inner
    return login_auth_func
@outer('else')  # 先执行函数调用outer('dict'),返回值login_auth_func,然后再在执行语法糖结构@login_auth_func
def func():
    print('loaded func')
func()

函数
递归函数的本质
函数在运行过程中直接或者间接的调用了自身
方式一,直接调用
import sys
sys.setrecursionlimit(500)
count = 0
def func():
    print('loaded func')
    global count
    count += 1
    print(count)
    func()
func()  # RecursionError: maximum recursion depth exceeded while calling a Python object
方式二,间接调用
import sys
sys.setrecursionlimit(500)
count = 0
def func():
    print('loading func')
    global count
    count += 1
    print(count)
    delete()
    print('loaded func')
def delete():
    print('loading delete')
    func()
    print('loaded delete')
delete()  # RecursionError: maximum recursion depth exceeded while calling a Python object

实际应用
# 公司薪资待遇分为五个级别,一级最低每个级别之间相差5000,现只知道一级员工的工资为15000,请问五级员工和十八级员工工资多少
# calculate_salary(5) = calculate_salary(4) + 5000
# calculate_salary(4) = calculate_salary(3) + 5000
# calculate_salary(3) = calculate_salary(2) + 5000
# calculate_salary(2) = calculate_salary(1) + 5000
def calculate_salary(n):
    if n == 1:
        return 15000
    return calculate_salary(n - 1) + 5000
print(calculate_salary(5))
print(calculate_salary(18))
l1 = [11, [22, [33, [44, [55, [66, [77, [88, [99, [100]]]]]]]]]]
'''要求:循环打印出列表中每一个数字'''
def seek_num(list1):
    for item in list1:
        if isinstance(item, int):  # 判断数据是否属于整型
            print(item)
        else:
            seek_num(item)
seek_num(l1)
算法之二分法
二分法是算法里面最简单的一个,主要用来感受算法的强大功能
tuple1 = (19, 25, 30, 53, 69, 73, 99, 102, 120, 177, 211, 333, 548, 666, 888, 999, 1001, 1111, 1200, 2500)
# 查找一个数 888
def get_target(tuple1, target_num):
    # 考虑找不到的情况,tuple1不可能无限制二分
    if len(tuple1) == 0:
        print('查无此数')
        return
    middle_index = len(tuple1) // 2
    if target_num > tuple1[middle_index]:
        tuple1_left = tuple1[middle_index + 1:]
        print(tuple1_left)
        get_target(tuple1_left, target_num)
    elif target_num < tuple1[middle_index]:
        tuple1_right = tuple1[:middle_index]
        print(tuple1_right)
        get_target(tuple1_right, target_num)
    else:
        print('找到了', target_num)
get_target(tuple1, 888)  # (333, 548, 666, 888, 999, 1001, 1111, 1200, 2500);(333, 548, 666, 888);(888,);找到了 888

 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号