装饰器补充,递归函数和二分法
装饰器补充
多层语法糖
# 判断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

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?