17、递归函数与匿名函数
一、函数的递归
函数的递归调用是函数嵌套的一种特殊形式,具体是指在调用一个函数的过程中,直接或间接地调用了自己。
# 直接调用
def f1():
print('from f1')
f1()
f1()

# 间接调用
def f1():
print('from f1')
f2()
def f2():
print('from f2')
f1()
f1()

从上图可以看出,两种情况下的递归调用都是一个无限循环的过程,但在python对函数的递归调用的深度做了限制,因而并不会像大家所想的那样进入无限循环,会抛出异常,要避免出现这种情况,就必须让递归调用在满足某个特定条件下终止。
可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000,虽然可以使用
sys.setrecursionlimit()去设定该值,但仍受限于主机操作系统栈大小的限制,而且也不推荐取改设定
二、回溯与递推
回溯:向下一层一层的调用
递推:向上一层一层的返回
举例:某公司四个员工,1号员工说自己薪资比2号员工高1000元,2号员工说自己薪资比3号员工高1000元,3号员工说自己薪资比4号员工高1000元,4号员工说自己薪资为5000元,那么一号员工薪资为多少元
# 代码实现过程
def salary(ren):
if ren == 4:
return 5000
return salary(ren + 1) + 1000
s = salary(1)
print(s)
# 运行结果
8000
小案例
# 猜年龄递归
def age(n):
if n == 1:
return 18
return age(n - 1) + 10
res = age(5)
print(res)
三、匿名函数
匿名函数与有名函数有相同的作用域,但是匿名意味着引用计数为0,使用一次就释放,所以匿名函数用于临时使用一次的场景,匿名函数通常与其他函数配合使用
匿名函数语法
lambda 参数1,参数2,...: expression
# 定义:
lambda x, y: x + y
# 调用:
res = (lambda x, y: x + y)(1, 2)
print(res)
匿名函数应用
比较下列人员的工资
# 算工资
salaries = {
'赵大丫': 11000,
'王铁柱': 9500,
'李狗剩': 13000,
}
def func(k):
return salaries[k]
# max和min是迭代一个可迭代对象的内容,然后取最大/最小的值
print(max(salaries,key=func))
'''func这个函数的应用范围极小,正常程序中如果真写了这么一个函数,那么除了在这里使用一下,其他地方基本就用不上了,所以匿名函数的作用就体现出来了'''
# 匿名函数计算
print(max(salaries, key=lambda k:salaries[k])) # 算工资高
print(min(salaries, key=lambda k:salaries[k])) # 算工资低

浙公网安备 33010602011771号