day12 课程(递归 & lambda & 高阶函数 & map & reduce & filter)
课程:https://www.bilibili.com/video/BV1o4411M71o?spm_id_from=333.788.videopod.episodes&p=221
12.1 了解递归
12.1.1 递归的应用场景
递归是一种编程思想,应用场景:
1.在日常开发中,如果要遍历一个文件夹下面所有的文件,通常会使用递归来实现
2.后续算法课程中,很多算法都离不开递归,例如:快速排序
12.1.2 递归的特点
1.函数内部自己调用自己
2.必须有出口
12.2 递归之回顾函数返回值
def return_num(): # 定义函数 return 100 # 函数返回值 result = return_num() # 调用函数 赋值给变量 print(result) # 打印变量 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day12\01.递归之回顾函数返回值.py 100 Process finished with exit code 0
12.3 递归代码实现
# 需求: 3 以内数字累加和 看成 6 = 3 + 2 + 1 # 6 = 3 + 2以内数字累加和 # 2以内数字累加和 = 2 + 1以内数字累加和 # 1以内数字累加和 = 1 # 这里是出口 def sum_num(num): if num == 1: # 判断是1, 直接返回1 即函数出口 return 1 return num + sum_num(num -1) # 如果不是1 , 重复执行累加 即 3 + 2 + 1 result = sum_num(3) print(result) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day12\02.递归代码实现.py 6 Process finished with exit code 0
12.4 递归的执行流程

1.调用 sum_num(num) 函数,传入 3,即计算 sum_num(3)
2.函数中计算 3 + sum_num(3 -1) ,即计算 3 + sum_num(2),调用函数 sum_num(2)
3.函数中计算 2 + sum_num(2 -1) ,即计算 2 + sum_num(1),调用函数 sum_num(1)
4.sum_num(1) 中 num = 1,判断成立 返回 1 即 sum_num(1) 返回 1
5.sum_num(2) 中 2 + num(1),即 sum_num(2) = 2 + 1
6.sum_num(3) 中 3 + num(2),即 sum_num(3) = 3 + 2 + num(1) = 3 + 2 + 1 = 6
12.5 递归出口问题
def sum_num(num): # if num == 1: # 当没有出口时 报错超出最大递归深度: RecursionError: maximum recursion depth exceeded # return 1 return num + sum_num(num -1) # 重复执行累加 result = sum_num(3) print(result) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day12\02.递归代码实现.py Traceback (most recent call last): File "D:\Pycharm\code\day12\02.递归代码实现.py", line 13, in <module> result = sum_num(3) File "D:\Pycharm\code\day12\02.递归代码实现.py", line 11, in sum_num return num + sum_num(num -1) # 重复执行累加 ~~~~~~~^^^^^^^^ File "D:\Pycharm\code\day12\02.递归代码实现.py", line 11, in sum_num return num + sum_num(num -1) # 重复执行累加 ~~~~~~~^^^^^^^^ File "D:\Pycharm\code\day12\02.递归代码实现.py", line 11, in sum_num return num + sum_num(num -1) # 重复执行累加 ~~~~~~~^^^^^^^^ [Previous line repeated 996 more times] RecursionError: maximum recursion depth exceeded Process finished with exit code 1
12.6 了解 lambda
12.6.1 lambda 的应用场景
如果一个函数有一个返回值,并且只有一句代码,可以使用 lambda 简化(程序执行时, 相同功能,lambda 在内存中开辟的空间更小,更省内存空间)
12.6.2 lambda 语法
lambda 参数列表: 表达式
注意:
1.lambda 表达式的参数可有可无,函数的参数在 lambda 表达式中完全适用
2.lambda 表达式能接收任何数量的参数,但只能返回一个表达式的值
12.7 体验 lambda
# 1. 函数 def fn1(): return 100 print(fn1) # 打印的是函数在内存中的地址 0x0000024DCCCD1580> result1 = fn1() # 调用函数赋值给变量 print(result1) # 2. lambda 又叫匿名函数 fn2 = lambda : 200 print(fn2) # 打印的是匿名函数 lambda 在内存中的地址 0x0000024DCCE4C360> result2 = fn2() # 调用 匿名函数lambda 赋值给变量 print(result2) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\03.体验 lambda.py" <function fn1 at 0x0000024DCCCD1580> 100 <function <lambda> at 0x0000024DCCE4C360> 200 Process finished with exit code 0
12.8 lambda 实例之计算两个数字累加和
# 需求: 计算任意两个数字的累加和 # 函数 def add_num1(num1, num2): # 函数两行代码 return num1 + num2 result1 = add_num1(1, 2) # 3 print(result1) # lambda 表达式 add_num2 = lambda num1, num2: num1 + num2 # lambda 表达式 1行代码 result2 = add_num2(1, 2) # 3 print(result2) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\04.lambda 实例之计算两个数字累加和.py" 3 3 Process finished with exit code 0
12.9 lambda 参数之无参数
# 无参数 fn1 = lambda: 100 print(fn1()) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\05.lambda 参数之无参数.py" 100 Process finished with exit code 0
12.10 lambda 参数之一个参数
# 一个参数 fn2 = lambda a: a # 形参是 a 返回 a 即:return a print(fn2('hello world')) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\06.lambda 参数之一个参数.py" hello world Process finished with exit code 0
12.11 lambda 参数之默认参数
# 默认参数 也叫缺省参数 fn3 = lambda a, b, c=100: a + b + c print(fn3(1, 2, 3)) # 传入三个参数, c 传参就用传入的参数, 没有传参就使用默认值 返回 6 print(fn3(1, 2)) # 传入两个参数, 返回 103 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\07.lambda 参数之默认参数.py" 6 103 Process finished with exit code 0
12.12 lambda 参数之 *args
# 可变参数位置参数 可传入多个参数, 返回元祖 fn4 = lambda *args: args print(fn4(1)) # 返回 (1,) 元组 print(fn4(1, 2, 3)) print(fn4( "a", "b", 3, 4, 5)) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\08.lambda 参数之 args.py" (1,) (1, 2, 3) ('a', 'b', 3, 4, 5) Process finished with exit code 0
注意:这里的可变参数传入到 lambda 之后,返回值为元祖
12.13 lambda 参数之 **kwargs
# 可变参数关键字参数 可传入多个关键字参数, 返回字典 fn5 = lambda **kwargs: kwargs print(fn5(name="Python")) # 返回 {'name': 'Python'} print(fn5(name="Python", age=18, gender="男")) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\09.lambda 参数之 kwargs.py" {'name': 'Python'} {'name': 'Python', 'age': 18, 'gender': '男'} Process finished with exit code 0
注意:这里的可变参数传入到 lambda 之后,返回值为字典
12.14 lambda 应用之带判断的 lamdba
# lambda 表达式 + 三元运算符 fn1 = lambda a, b: a if a > b else b # 判断, if a > b 返回 a 否则返回 b print(fn1(66, 88)) # 返回 88 print(fn1(1000, 50)) # 返回 1000 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\10.lambda 应用之带判断的 lamdba.py" 88 1000 Process finished with exit code 0
12.15 lambda 应用之列表内字典数据排序
# 需求: 按列表中字典 age 的 value 排序 students = [ {"name":"Tom", "age":20}, {"name":"Rose", "age":18}, {"name":"Jack", "age":22}, ] # 按 name 值升序排序 默认resource = false lambda 形参: 参数中 name 的 key students.sort(key=lambda x: x["name"]) # 按照列表中字典的 key 排序 print(students) # 首字母 升序排序 Jack Rose Tom # 按 age 值降序排序 students.sort(key=lambda x: x["age"], reverse=True) print(students) # 年龄降序排序 22 20 18 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\11.lambda 应用之列表内字典数据排序.py" [{'name': 'Jack', 'age': 22}, {'name': 'Rose', 'age': 18}, {'name': 'Tom', 'age': 20}] [{'name': 'Jack', 'age': 22}, {'name': 'Tom', 'age': 20}, {'name': 'Rose', 'age': 18}] Process finished with exit code 0
12.16 了解高级函数
把函数作为参数传入,这样的函数称为高级函数,高级函数是函数式编程的体现,函数式编程就是指这种高度抽象的编程范式,作用:化简代码,增加函数的灵活性
12.17 abs 和 round
abs() 函数可以完成对数字求绝对值计算
# abs() 绝对值 print(abs(-10)) # 10 print(abs(0)) # 0 print(abs(6)) # 6 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\12.abs 和 round.py" 10 0 6 Process finished with exit code 0
round() 函数可以完成对数字的四舍五入计算
# round() 四舍五入 print(round(1.2)) # 1 print(round(1.9)) # 2 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\12.abs 和 round.py" 1 2 Process finished with exit code 0
12.18 体验高级函数的思路分析
需求:任意两个数字,按照指定要求整理数字后再进行求和计算
# 方法 先求绝对值再求和 def add_num(num1, num2): return abs(num1) + abs(num2) print(add_num(1.2, -2)) # 1.2 + 2 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day12\13.体验高级函数的思路分析.py 3.2 Process finished with exit code 0
# 方法 先四舍五入再求和 def round_num(num1, num2): return round(num1) + round(num2) print(round_num(1.2, -2)) # 1 + -2 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day12\13.体验高级函数的思路分析.py -1 Process finished with exit code 0
12.19 体验高阶函数的代码实现
# 高级用法, 可以传入函数名, 一个函数实现两种用法 def num(num1, num2, f): # f 是第三个参数, 用来接收将来传入的函数 return f(num1) + f(num2) print(num(-1.2, 6.6, abs)) # 1.2 + 6.6 print(num(-1.2, 6.6, round)) # -1 + 7 ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe D:\Pycharm\code\day12\14.体验高阶函数的代码实现.py 7.8 6 Process finished with exit code 0
注意:两种方法对比之后,发现,高阶函数的代码会更加简洁,函数灵活性更高
函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度更快
12.20 内置高阶函数之 map
map(func, list) ,将传入的函数变量 func 作用到 list 变量的每个元素中,并将结果组成:(Python2)返回新的列表/ (Python3)返回迭代器
需求:计算 list1 序列中各个数字的平方
list1 = [1, 2, 3, 4, 5] def fun(x): return x ** 2 result = map(fun, list1) # map 将列表中的数据每个都执行一遍函数调用 print(result) # 打印结果的内存地址 <map object at 0x000001D95E752650> print(list(result)) # 将内存地址中数据转换成列表 [1, 4, 9, 16, 25] ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\15.内置高阶函数之 map.py" <map object at 0x000001D95E752650> [1, 4, 9, 16, 25] Process finished with exit code 0
12.21 内置高阶函数之 reduce
reduce(func, list),其中 func 必须有两个参数,每次 func 计算的结果继续和序列的下一个元素做累计计算
注意:reduce() 传入的参数 func 必须接收 2 个参数
需求:计算 list2 序列中各个数字的累加和
import functools # 需要导入模块 list2 = [1, 2, 3, 4, 5] def fun(a, b): # 必须有两个参数,因为需要累计计算 return a + b result = functools.reduce(fun, list2) # 功能函数计算的结果和序列下一个数据做累计计算 1 + 2 + 3 + 4 + 5 = 15 print(result) ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\16.内置高阶函数之 reduce.py" 15 Process finished with exit code 0
12.22 内置高阶函数之 filter
filter(func,list) 函数用于过滤序列,过滤掉不符合条件的元素,返回一个 filter 对象,如果要转换为列表,可以使用 list() 来转换
list3 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 定义功能函数, 过滤序列中的偶数 def fun(x): return x % 2 == 0 # 参数除以2 等于 0 result = filter(fun, list3) # 可以过滤序列中的数据 print(result) # 打印结果的内存地址 <filter object at 0x000001EB3CC525C0> print(list(result)) # 将内存地址中数据转换成列表 [2, 4, 6, 8, 10] ------------------------------------------------ 执行后 C:\Users\马俊南\AppData\Local\Microsoft\WindowsApps\python3.13.exe "D:\Pycharm\code\day12\17.内置高阶函数之 filter.py" <filter object at 0x000001EB3CC525C0> [2, 4, 6, 8, 10] Process finished with exit code 0
12.23 函数加强总结
递归:
1.函数内部自己调用自己
2.必须有出口
lambda:
# 语法 lambda 参数列表: 表达式
lambda的参数形式:
# 无参数 lambda : 表达式
# 一个参数 lambda 参数: 表达式
# 默认参数/缺省参数 lambda key=value: 表达式
# 不定长位置参数 lambda *args: 表达式
# 不定长关键字参数 lambda **kwargs: 表达式
高级函数:
作用:把函数作为参数传入,化简代码
内置高阶函数:
1.map():把函数作用于列表,返回列表或迭代器
2.reduce():导入模块,对列表做累计计算
3.filter():过滤不满足要求的数据,返回一个可以转换的内存地址
———————————————————————————————————————————————————————————————————————————
无敌小马爱学习
浙公网安备 33010602011771号