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 递归的执行流程

image

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():过滤不满足要求的数据,返回一个可以转换的内存地址

———————————————————————————————————————————————————————————————————————————

                                                                                                                         无敌小马爱学习

posted on 2025-09-28 13:48  马俊南  阅读(13)  评论(0)    收藏  举报