20 分钟
Python 进阶

高阶函数与闭包

理解函数是一等公民,掌握闭包

  • 函数作为参数和返回值
  • 理解闭包和自由变量
  • 编写简单的装饰器雏形

函数是一等公民

Python 中函数可以赋值给变量、作为参数传递、作为返回值:

示例代码(可运行)

闭包

内部函数用了外部函数的变量,外部函数返回这个内部函数,这就是闭包。

示例代码(可运行)
💡闭包的本质

闭包就是函数加上它引用的外部变量。外部函数执行完,内部函数还能记住那些变量。

简单计数器

示例代码(可运行)
预测输出
def f(x):
    def g(y):
        return x + y
    return g
add5 = f(5)
print(add5(3))
找 Bug内部函数改外部变量,得加nonlocal声明。
def counter(): n = 0 def inc(): n += 1 return n return inc
填空题填写空白处的代码
def make_adder(n): def adder(x): return x + n return adder add10 = make_adder(10) print(add10(5)) #
选择题

闭包中修改外部变量需要?

选择题

在 for 循环里创建的多个 lambda 都引用了循环变量,循环结束后调用,它们看到的值通常是?

资深工程师加餐

底层原理 · 大厂视角 · 工程经验,点卡片展开

list 底层是一段连续的指针数组,容量不够时整体扩容(CPython 约按 1.125 倍)。因此按下标取元素是 O(1),末尾 append 均摊 O(1),但在头部 insert(0,…) 或 pop(0) 要搬动全部元素、是 O(n)。dict/set 基于哈希表,平均查找 O(1) 但更耗内存。选对数据结构,往往比抠语法更影响性能。

挑战任务

闭包挑战

简单+50 XP

用闭包创建一个密码验证器。

闭包挑战
2 个测试用例

课后作业

缓存函数

中等+20 XP

用闭包实现简单的记忆化缓存。

缓存函数
1 个测试用例