递归的应用场景
1、日常开发中,遍历一个文件夹下所有文件
2、高级算法中,如:快速排序
递归的特点
- 函数内部自己调用自己
- 必须有出口
递归之回顾函数返回值
返回值的位置:函数调用的位置
递归代码实现
需求
3以内数字累加和
分析
3以内数字累加和:3 + 2 + 1 = 6
6 = 3 + 2以内数字累加和
2以内数字累加和 = 2 + 1以内数字累加和
1以内数字累加和 = 1 #即为出口
代码实现
def sum_num(num):
# 出口
if num == 1:
return 1
# 当前数字 + 当前数字 - 1 的累加和
return num + sum_num(num - 1)
result = sum_num(3)
print(result)
输出:6
递归的执行流程
递归出口问题
如果没有出口会报错,超过最大递归深度(不同计算机不同)
lambda
lambda应用场景
如果一个函数有一个返回值并且只有一句代码,可以使用lambda简化
lambda语法
lambda 参数列表:表达式
注意:
- lambada表达式参数可有可无,函数的参数在lambda表达式中完全适用
- lambda表达式能接收任何数据量的参数但只能返回一个表达式的值
体验lambda
函数
def fn1():
return 100
result = fn1()
print(result)
输出:100
lambda
fn2 = lambda: 100
print(fn2)
print(fn2())
输出:
<function
100
注意: 直接打印lambda表达式输出的是lambda的内存地址
lambda实例
计算两个数字累加和
计算a + b
函数实现
def add(a, b):
return a + b
result = add(1, 2)
print(result)
输出:3
lambda实现
fn1 = lambda a, b: a + b
print(fn1(2, 3))
输出:5
lambda的参数形式
无参数
fn1 = lambda: 100
print(fn1())
输出:100
一个参数
fn1 = lambda a: a
print(fn1('hello python'))
输出:python
默认参数
fn1 = lambda a, b, c=100: a + b + c
print(fn1(200, 300))
输出:600
可变参数:*args
fn1 = lambda *args: args
print(fn1(100, 200, 300, 400))
输出:(100, 200, 300, 400)
可变参数:**kwargs
fn1 = lambda **kwargs: kwargs
print(fn1(name='python', age=20, id=500))
输出:{'name': 'python', 'age': 20, 'id': 500}
lambda应用
带判断的lambda
fn1 = lambda a, b: a if a > b else b
print(fn1(100, 500))
输出:500
列表数据按字典key的值排序
按name值升序排列
people = [
{'name': 'aa', 'age': 10},
{'name': 'cc', 'age': 20},
{'name': 'bb', 'age': 30},
{'name': 'dd', 'age': 40},
{'name': 'ee', 'age': 50}
]
people.sort(key=lambda x: x['name'])
print(people)
输出:[{'name': 'aa', 'age': 10}, {'name': 'bb', 'age': 30}, {'name': 'cc', 'age': 20}, {'name': 'dd', 'age': 40}, {'name': 'ee', 'age': 50}]
按name值降序排列
people.sort(key=lambda x: x['name'], reverse=True)
print(people)
输出:[{'name': 'ee', 'age': 50}, {'name': 'dd', 'age': 40}, {'name': 'cc', 'age': 20}, {'name': 'bb', 'age': 30}, {'name': 'aa', 'age': 10}]
按age值升序排序
people.sort(key=lambda x: x['age'], reverse=False)
print(people)
输出:[{'name': 'aa', 'age': 10}, {'name': 'cc', 'age': 20}, {'name': 'bb', 'age': 30}, {'name': 'dd', 'age': 40}, {'name': 'ee', 'age': 50}]
注意: reverse默认值为False,可以不输入
按age值降序排序
people.sort(key=lambda x: x['age'], reverse=True)
print(people)
输出:[{'name': 'ee', 'age': 50}, {'name': 'dd', 'age': 40}, {'name': 'bb', 'age': 30}, {'name': 'cc', 'age': 20}, {'name': 'aa', 'age': 10}]