day14函数递归调用

时间:2025-01-06 09:05:50

day14函数递归调用

1、装饰器叠加

def deco1(func1):
def wrapper1(*args,**kwargs):
print('=====>wrapper1 ')
res1 =func1(*args,**kwargs)
return res1
return wrapper1
def deco2(func2):
def wrapper2(*args,**kwargs):
print('=======>wrapper2')
res2 = func2(*args,**kwargs)
return res2
return wrapper2
def deco3(func3):
def wrapper3(*args,**kwargs):
print('=====>wrapper3')
res3 =func3(*args,**kwargs)
return res3
return wrapper3
@deco1 # deco1(函数wrapper2的内存地址)->函数wrapper1的内存地址
@deco2 # deco2(函数wrapper3的内存地址)->函数wrapper2的内存地址
@deco3 # deco3(最原始那个index函数的内存地址)->函数wrapper3的内存地址
def index():
print('====>index')
return 123
res =index()
print(res)
输出结果:
=====>wrapper1
=======>wrapper2
=====>wrapper3
====>index
123

2、函数递归调用

1、什么是函数递归调用
函数递归调用是函数嵌套调用的一种特殊格式,具体是指在调用一个函数的过程中。
又直接或者间接的调用自己
函数递归调用不应该无限递归调用下去,应该在满足某种条件下结束递归调用
所以,函数递归调用应该分为两个阶段:
1.回溯
2.递推
案例1:
def age(n): #5,4,3,2,1 #2,3,4,5,
if n == 1:
return 30
return age(n-1)+10 #一层层推进,一层层反过来加上来
res=age(5)
print(res)
输出结果:70
案例2:
l = [1,[2,[3,[4,[5,[6,[7]]]]]]]
def foo(l):
for item in l:
if type(item) is not list:# 判断是列表不打印
print(item)
else:
foo(item)
foo(l)
输出结果:1 2 3 4 5 6 7 2、基于递归实现二分法:
nums = [-3, 5, 7, 11, 21, 31, 41, 53, 67, 77, 83, 99, 101]
find_num = 67 # 需要找的值
print(len(nums)) # 列表有13个值
def srarch(nums,find_num):
print(nums)
if len(nums) == 0:
print('不存在')
return
mid_index = len(nums)//2 # 列表长度整除2赋值给变量名,13//2=6
if find_num > nums[mid_index]: # 67 > 41,取6的索引对应值
srarch(nums[mid_index+1:],find_num) # 在右半部分
elif find_num < nums[mid_index]: # 变量名(传值)大于列表(值)
srarch(nums[:mid_index],find_num) #在 左半部分
else:
print('找到了')
srarch(nums,67)

3、生成器

    a = [i for i in range(1,6)]
l = [i**2 for i in range(1,6)]
c = [i/2 for i in range(1,8)]
print(a,l,c)
输出结果:[1, 2, 3, 4, 5] [1, 4, 9, 16, 25] [0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5]
l = [i for i in range(1,10) if i < 10]
print(l)
输出结果:[1, 2, 3, 4, 5, 6, 7, 8, 9] 1.列表生成器:找出dsb
names = ['liusir_dsb', 'housir_dsb', 'egon', 'wusir_dsb']
res = [i for i in names if i.endswith('dsb')] #找出关键词dsb
print(res)
输出结果:['liusir_dsb', 'housir_dsb', 'wusir_dsb'] 2.字典生成式
res = {k:v for k,v in [('name','meng'),('age',18)]}
print(res)
输出结果:{'name': 'meng', 'age': 18} 3.集合生成器
res = {i for i in range(5)}
print(res,type(res))
输出结果:{0, 1, 2, 3, 4} <class 'set'> 4.生成器表达式
l = [i for i in range(1,6)]
print(l)
print(next(l))

4、匿名函数

调用匿名函数方式一   # 不推荐使用
f=lambda x,y:x+y
print(f(1,2)) 调用匿名函数方式二 #推荐使用
res = (lambda x,y:x+y)(1,2) #调用函数传值
print(res)