【Python零基础到进阶】递归,闭包,匿名函数

部署运行你感兴趣的模型镜像

包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】!

1.递归

1.什么是递归?
  • 递归是指一个函数直接或间接调用自身的编程技巧。就像俄罗斯套娃一样,每层函数都包含下一层的调用结构。
核心思想:
  • 将大问题分解为小问题。
  • 通过递归调用自身解决小问题。
  • 将小问题的结果组合成大问题的解。
2.递归的三要素:
1 def recursion_example(n):
2     # 基例(终止条件)
3     if n == 1:
4         return 1
5     # 递归式(自我调用)
6     return n * recursion_example(n-1)
解析:
  • 基例:终止递归的条件(如n==1)
  • 递归式:将大问题拆分为子问题的表达式
  • 子问题规模:每次调用必须使问题规模减小(n-1)
3.阶乘计算示范
1 def factorial(n):
2     """计算n的阶乘"""
3     if n <= 1:
4         return 1
5     return n * factorial(n-1)
6 
7 print(factorial(5))  # 输出120
演示:
1 factorial(5)5*factorial(4)
25*(4*factorial(3))
35 * 4*(3*factorial(2))
45 * 4 * 3*(2*factorial(1))5 * 4 * 3 * 2 * 1 = 120
4.递归的优缺点
优点:
  • 代码简洁,逻辑清晰。
  • 适合解决分治问题(如树的遍历、汉诺塔问题)。
缺点:
  • 递归调用会消耗大量内存(栈空间)。
  • 如果基准条件设置不当,可能导致栈溢出。

2.闭包

1.什么是闭包?
  • 闭包是指在函数内部定义了一个内部函数,并且内部函数可以访问外部函数的变量。外部函数返回内部函数的引用,形成闭包。
核心特点:
  • 内部函数可以访问外部函数的变量。
  • 外部函数返回内部函数的引用。
  • 闭包可以“记住”外部函数的状态。
  • 【函数嵌套 + 返回内部函数 + 保留外部状态】
2.普通函数 🆚 闭包
  • 从普通函数到闭包的变化
1 # 普通函数
2 def func_1():
3     print('你好')
4 
5 def func_2():
6     print('欢迎来到Python课堂')
  • 普通函数的特点:独立函数,无法共享状态。
1 # 闭包
2 def func_1():
3     print('你好')
4     
5     def func_2():
6         print('欢迎来到Python课堂')
7     
8     return func_2  # ❗️ 返回内部函数的引用
  • 闭包的特点:func_2 捕获了func_1的状态,形成闭包。
闭包的调用方法:
1 f = func_1()    # 获取内部函数的引用
2 f()            # 调用闭包
3 # 或者链式调用:
4 func_1()()      # 直接执行闭包

在这里插入图片描述

3.闭包返回值与参数

闭包的灵活用法
1 def func_1(name):
2     subject = 'Python'
3     
4     def func_2(year):
5         return f'{name}{year}{subject}课堂学习!'
6     
7     return func_2
8 
9 # 调用示例
10 f = func_1('Alice')
11 result = f(2025)
12 print(result)  # 输出:Alice在2025Python课堂学习!
闭包的作用:
  • 外部函数func_1的参数name和变量subject被封装在闭包中。
  • 内部函数func_2可动态生成带年份和主题的字符串。
    在这里插入图片描述

4.闭包的变量作用域

  • 闭包如何"记住"外部变量?
1 def outer():
2     x = 10  # 外部变量
3     print('外部函数')
4     def inner():
5         print(x)  # ❓ 如何访问x?
6 
7     return inner
8 
9 
10 f = outer()
11 f()  # 输出:10  // 如果注释掉这个,不会输出10.
  • 原理:闭包形成时,会记录外部函数的作用域链(变量查找路径)。
  • 关键点:即使外部函数执行结束,闭包仍保留对x的引用。
    在这里插入图片描述

5.闭包的优缺点

✅ 优点:
  • 1.封装性:不需要定义全局变量即可实现通过函数,访问和修改某个值;
  • 2.模块化:闭包函数所引用的外部变量,也就是外层函数里定义的变量,作用封闭,不会被错误调用或修改.
⚠️ 缺点:
  • 1.占用内存资源: 内部函数一直在引用外部函数里定义的变量,所以会导致这个变量一直占用内存.

3.变量的作用域

Python的变量作用域规则
  • 变量查找顺序为 Local(局部)→ Enclosing(嵌套外层)→ Global(全局)→ Built-in(内置)
示例:
1 # 全局作用域
2 name = "Global Name"
3 
4 def outer():
5     # 外层函数作用域
6     name = "Outer Name"
7 
8     def inner():
9         # 内层函数作用域
10         name = "Inner Name"
11         print(name)  # ❓ 输出什么?
12     inner()
13 
14 outer()
15 # 输出:Inner Name

在这里插入图片描述

全局变量🆚局部变量

全局变量
  • 定义在函数外,模块级作用域。
  • 代码示例:
2 
3 def print_global():
4     print(GLOBAL_VAR)  # 直接访问全局变量
局部变量
  • 定义在函数内,仅在该函数中有效。
  • 代码示例:
1 def print_local():
2     LOCAL_VAR = 42  # 局部变量
3     print(LOCAL_VAR)

修改外层变量的关键字

global 与 nonlocal 的区别
场景1:修改全局变量
1 num = 100  # 全局变量
2 
3 def modify_global():
4     global num  # 声明修改全局变量
5     num += 10
6     print(num)  # 输出:110
7 
8 modify_global()
9 print(num)      # 输出:110

在这里插入图片描述

场景2:修改外层函数的局部变量
1 def outer():
2     num = 100  # 外层局部变量
3 
4     def modify_nonlocal():
5         nonlocal num  # 声明修改外层变量
6         num += 10
7         print(num)  # 输出:110
8 
9     modify_nonlocal()
10     print(num)      # 输出:110
11 
12 outer()

在这里插入图片描述

闭包中的变量作用域
  • 闭包如何"记住"外部变量?见示例:
1 def make_counter():
2     count = 0  # 外层局部变量
3     
4     def inner():
5         nonlocal count  # 必须声明,否则会报错!
6         count += 1
7         return count
8     
9     return inner
10 
11 counter = make_counter()
12 print(counter())  # 输出:1
13 print(counter())  # 输出:2
14 """闭包保存了对外层变量count的引用,即使外层函数已执行完毕。"""

在这里插入图片描述
在这里插入图片描述

4.匿名函数

1.什么是匿名函数?
  • 匿名函数是一种没有名字的函数,用 lambda 关键字定义。它适用于简单的、单行的函数逻辑。
  • 语法格式:lambda 参数列表: 表达式
2.匿名函数的使用
普通函数🆚匿名函数
  • 示例:
1 # 普通函数
2 def fun_a(x, y):
3     return x * y
4 
5 a = fun_a(4, 5)
6 print(a)  # 输出:20
7 
8 # 匿名函数
9 fun_b = lambda x, y: x * y
10 print(fun_b(4, 5))  # 输出:20
对比优势:
  • 简洁性:无需 def 关键字和函数体。
  • 即时性:适合临时性、短小的逻辑。
    在这里插入图片描述
Lambda的条件表达式
  • 示例:用Lambda实现条件判断
1 # 显式函数实现奇数判断
2 def is_odd(x):
3     return x if x % 2 == 1 else None
4 
5 a = is_odd(9)
6 print(a)  # 输出:9
7 
8 # Lambda简化写法
9 is_odd_lambda = lambda x: x if x % 2 == 1 else None
10 print(is_odd_lambda(9))  # 输出:9

在这里插入图片描述

Lambda与map函数:
  • 使用lambda和map函数将每个元素平方。
1 numbers = [1, 2, 3, 4, 5]
2 squared = list(map(lambda x: x ** 2, numbers))
3 print(squared)  # 输出:[1, 4, 9, 16, 25]
lambda与filter:
  • 使用lambda和filter函数过滤偶数。
1 numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2 # 使用lambda和filter函数过滤偶数
3 even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
4 print(even_numbers)  # 输出: [2, 4, 6, 8, 10]

在这里插入图片描述

lambda与sorted:
  • sorted函数以匿名函数为判断标准进行排序。
  • 使用sorted函数和lambda匿名函数按年龄排序(以匿名函数的返回值作为判断标准)
1 data = [
2     {"name": "Alice", "age": 25},
3     {"name": "Bob", "age": 30},
4     {"name": "Charlie", "age": 20}
5 ]
6 
7 sorted_data = sorted(data, key=lambda x: x['age'])
8 print(sorted_data)  
  • 关键参数:key=lambda x: x[‘age’]指定按字典的 age 字段排序。
    在这里插入图片描述
3.Lambda的嵌套与闭包
1 def haha(n):
2     return lambda x: x ** n  # ❗️ 返回一个闭包
3 
4 # 创建不同次方的函数
5 square = haha(2)    # 平方
6 cube = haha(3)      # 立方
7 
8 print(square(5))   # 输出:25
9 print(cube(5))    # 输出:125

在这里插入图片描述
图片

总结

  • 最后希望你编程学习上不急不躁,按照计划有条不紊推进,把任何一件事做到极致,都是不容易的,加油,努力!相信自己!

文末福利

  • 最后这里免费分享给大家一份Python全套学习资料,希望能帮到那些不满现状,想提升自己却又没有方向的朋友,也可以和我一起来学习交流呀。
包含编程资料、学习路线图、源代码、软件安装包等!【[点击这里]】领取!
  • ① Python所有方向的学习路线图,清楚各个方向要学什么东西
  • ② 100多节Python课程视频,涵盖必备基础、爬虫和数据分析
  • ③ 100多个Python实战案例,学习不再是只会理论
  • ④ 华为出品独家Python漫画教程,手机也能学习

可以扫描下方二维码领取【保证100%免费在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值