二、函数进阶学习笔记

二、函数进阶学习笔记

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),意味着函数可以像普通变量一样:
  1. 赋值给变量
  1. 作为参数传递给其他函数
  1. 作为其他函数的返回值
  1. 存储在数据结构中

4.1 函数赋值给变量

📝 我的理解:函数赋值给变量,就像是给工具起别名——同一个工具,可以有多个名字,用哪个名字都能调用。

5. 高阶函数

5.1 什么是高阶函数?

高阶函数是指满足以下任一条件的函数:
  1. 接收一个或多个函数作为参数
  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 需要注意的

  1. lambda 使用场景:简单的一次性操作,如排序 key、map/filter 的函数参数
  1. 高阶函数使用场景:需要对数据进行统一转换或筛选时
  1. 闭包使用场景:需要创建带状态的函数(如计数器、缓存)
  1. 装饰器使用场景:需要在多个函数前后执行相同操作(如日志、权限检查、计时)
推荐云服务

雨云 - 云服务器首选

稳定 · 高速 · 性价比超高

使用优惠码立享折扣,开启你的云端之旅~

一元试用秒级开通24h在线客服

优惠码

zqf
立即访问
Loading...
灵心小窝

灵心小窝

这里不是一个喧闹的地方,只是用来存放一些还不想遗忘的东西。

声明 © 2026 早清风
加载中...