Python 现代开发学习笔记

03-03 闭包独立状态

本章题解 · 全部练习

题目

写一个创建编号器的函数,参数为起始编号。第一份从 1 开始,第二份从 100 开始;交错调用,应得到 1、100、2、101,两份状态互不修改。

推导与做法

每调用一次 make_counter,都会建立一份独立的外层局部变量 value。返回的 next_number 通过闭包继续访问这份变量,nonlocal 让加一写回外层绑定。

调用 第一份下一编号 第二份下一编号 返回
first() 2 100 1
second() 2 101 100
first() 3 101 2
second() 3 102 101

过程图

%% 每个节点保留输入、执行位置或执行后的实际状态。 flowchart TD S0["make_counter(1):独立 value=1"] S1["first() 返回1,自己的 value变2"] S0 --> S1 S2["second() 返回100,另一份 value变101"] S1 --> S2 S3["再交错调用:2、101"] S2 --> S3 classDef default fill:#EEF0FB,stroke:#4657B5,color:#24324A linkStyle default stroke:#4657B5

实现与运行

查看带注释实现。本题与相关处理函数放在同一章节代码文件中;启动工具负责定位相邻项目和选择题号。

在配套目录的 函数与模块/reading_project 中运行。

# 使用项目解释器运行本题,题号决定执行哪一组演示。
python "../../学习索引/参考实现/代码/ch03.py" 03-03

程序按题号输出处理后的值、查询结果或状态。先和前面的手算比较,再修改一项输入重跑。

查看本题运行结果
# 与上面的手算状态和题目数值逐项比较。
[
  1,
  100,
  2,
  101
]

笔记正文与全部题解 · Ctrl / ⌘ K