二、函数进阶学习笔记
2026-02-21
Python基础
type
Post
status
Published
date
Feb 21, 2026
slug
python-function-advanced-study-notes-2
summary
接触到函数进阶内容才发现,Python 的函数远比我想象的灵活和强大!匿名函数、高阶函数、闭包、装饰器...这些概念一开始让我有点晕,现在还是晕.
tags
Python函数
category
Python基础
icon
password
💡 学习感悟:接触到函数进阶内容才发现,Python 的函数远比我想象的灵活和强大!匿名函数、高阶函数、闭包、装饰器...这些概念一开始让我有点晕,现在还是晕.
1. 变量作用域
1.1 局部变量
1.2 全局变量
⚠️ 注意:修改全局变量必须用global声明!
1.3 nonlocal 关键字
在嵌套函数中修改外部函数的变量:
📝 我的理解:global用于修改全局变量,nonlocal用于修改外层函数的变量。只读不需要声明,修改必须声明!
2. 传参方式:值传递 vs 引用传递
Python 中参数的传递方式:不可变类型是值传递,可变类型是引用传递。
不可变类型(值传递):
可变类型(引用传递):
⚠️ 踩坑:如果不希望函数修改外部的可变对象,需要先复制一份:
3. 匿名函数(lambda)
3.1 什么是 lambda 函数?
lambda 函数是一种匿名函数,即没有名字的函数。
📝 我的理解:lambda 就像是临时便签——写一些简单的功能,用完即走,不需要正式定义一个函数。
3.2 lambda 语法
3.3 lambda 的实际应用
📝 我的理解:lambda 最常见的用法就是作为参数传给其他函数,比如排序时指定 key、map 转换、filter 过滤等。
4. 函数是一等公民
在 Python 中,函数是一等公民(First-Class Citizen),意味着函数可以像普通变量一样:
- 赋值给变量
- 作为参数传递给其他函数
- 作为其他函数的返回值
- 存储在数据结构中
4.1 函数赋值给变量
📝 我的理解:函数赋值给变量,就像是给工具起别名——同一个工具,可以有多个名字,用哪个名字都能调用。
5. 高阶函数
5.1 什么是高阶函数?
高阶函数是指满足以下任一条件的函数:
- 接收一个或多个函数作为参数
- 返回一个函数
📝 我的理解:高阶函数就像是万能工具——它本身不干活,而是调用你传进来的函数来干活。
5.2 函数作为参数
函数可以像普通变量一样作为参数传递给其他函数。
📝 我的理解:把函数当参数,就像是换不同的工具处理同一份材料——用锤子砸、用剪刀剪、用刷子刷,材料一样,但结果完全不同!
5.3 函数作为返回值
函数可以作为另一个函数的返回值。
📝 我的理解:函数作为返回值,就像是工厂生产工具——你告诉工厂要生产什么样的工具(传参数),工厂就给你造一个定制版的工具(返回函数),以后用这个工具干活就行了!
5.4 常用高阶函数
map() - 映射
📝 我的理解:map()就像是流水线加工——把每个原料(元素)都经过同样的加工(函数),得到新的产品(结果)。
filter() - 过滤
📝 我的理解:filter()就像是筛子——把不符合条件的(函数返回 False)筛掉,只留下符合条件的(函数返回 True)。
reduce() - 归约
📝 我的理解:reduce()就像是把一堆东西慢慢合并成一个——先把前两个合并,结果再和第三个合并,直到最后只剩一个结果。
6. 闭包(Closure)
6.1 什么是闭包?
闭包是指内部函数记住了外部函数的变量,即使外部函数已经执行完毕。
📝 我的理解:闭包就像是函数带着自己的行李——内部函数离开外部函数时,把用到的外部变量一起打包带走了,所以即使外部函数结束了,内部函数还能用那些变量。
6.2 闭包的应用
计数器示例:
📝 我的理解:每个闭包都有自己的独立空间,就像每个人都有自己的储物柜,互相不影响!
7. 装饰器(Decorator)
7.1 什么是装饰器?
装饰器是一种用于修改或增强函数功能的高级技术,本质上是一个接收函数作为参数并返回新函数的高阶函数。
📝 我的理解:装饰器就像是给函数穿外套——不改变函数本身,但在函数执行前后可以加点料(比如记录日志、计时、权限检查等)。
7.2 带参数的装饰器
📝 我的理解:带参数的装饰器需要三层嵌套:最外层接收装饰器参数,中间层接收被装饰的函数,最内层执行包装逻辑。这就像是定制工厂——先告诉工厂你的需求(n=3),工厂再给你生产装饰器。
8. 踩坑记录
8.1 lambda 不能写复杂逻辑
⚠️ 踩坑:lambda 只能写单行表达式,不能包含语句(如赋值、循环、条件等)。如果需要复杂逻辑,就用普通函数。
8.2 忘记把 map/filter 结果转为列表
⚠️ 踩坑:map()和filter()返回的是迭代器,不是列表。如果需要列表,必须用list()转换。
8.3 闭包中修改外部变量忘记 nonlocal
⚠️ 踩坑:在闭包中修改外部函数的变量,必须用nonlocal声明,否则会报UnboundLocalError。
8.4 装饰器丢失了原函数信息
⚠️ 踩坑:写装饰器时记得用@wraps(func),否则原函数的__name__和__doc__会被替换成 wrapper 的信息!
9. 核心知识点整理
9.1 函数进阶概念速查
概念 | 说明 | 关键字/语法 |
局部变量 | 函数内部定义的变量 | 无 |
全局变量 | 函数外部定义的变量 | global |
闭包变量 | 嵌套函数中外部函数的变量 | nonlocal |
匿名函数 | 没有名字的简单函数 | lambda |
高阶函数 | 接收或返回函数的函数 | 无 |
闭包 | 记住外部变量的内部函数 | 嵌套函数 |
装饰器 | 增强函数功能的语法 | @decorator |
9.2 常用高阶函数速查
函数 | 作用 | 示例 |
map(func, iterable) | 对每个元素应用函数 | map(lambda x: x*2, [1,2,3]) |
filter(func, iterable) | 筛选符合条件的元素 | filter(lambda x: x>0, [-1,1,2]) |
reduce(func, iterable) | 累积计算 | reduce(lambda x,y: x+y, [1,2,3]) |
sorted(iterable, key=func) | 排序 | sorted(list, key=lambda x: x['score']) |
9.3 装饰器模板
简单装饰器:
带参数的装饰器:
9.4 需要注意的
- lambda 使用场景:简单的一次性操作,如排序 key、map/filter 的函数参数
- 高阶函数使用场景:需要对数据进行统一转换或筛选时
- 闭包使用场景:需要创建带状态的函数(如计数器、缓存)
- 装饰器使用场景:需要在多个函数前后执行相同操作(如日志、权限检查、计时)
Loading...
