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]))  # 算工资低
posted @ 2021-03-31 19:42  黑影Poco  阅读(97)  评论(0)    收藏  举报