Chapter 04 / 10

Notebook 界面解析

深入了解菜单栏、工具栏、单元格区域和 Kernel 状态指示器的每个细节

打开 Notebook

在主页点击 .ipynb 文件,会在新浏览器标签页中打开 Notebook 编辑界面。

Jupyter Notebook 编辑界面
Notebook 编辑界面 — 可看到 Markdown 单元格、代码单元格和菜单工具栏

界面结构总览

Notebook 编辑界面从上到下分为四个区域:

① 标题栏 文件名 · Last Checkpoint · Kernel 图标
② 菜单栏 File · Edit · View · Run · Kernel · Settings · Help
③ 工具栏 保存 · 插入 · 剪切 · 复制 · 粘贴 · 运行 · 停止 · 重启 · 单元格类型
④ 单元格区域(活跃单元格 — 蓝色边框)
    普通单元格 — 灰色边框

① 标题栏

顶部最上方区域包含:

② 菜单栏

菜单栏提供所有操作命令:

菜单关键功能
File New Notebook、Save、Save as、Rename、Download as(导出)、Close and Halt
Edit 剪切/复制/粘贴单元格、撤销/重做、查找替换(Ctrl+H)、分割单元格
View 显示/隐藏工具栏、行号、输出折叠
Run Run Selected、Run All、Run All Below、Run All Above
Kernel Interrupt(停止)、Restart、Restart & Run All、Change Kernel
Help Keyboard Shortcuts、User Interface Tour、Python/NumPy 文档链接

③ 工具栏

工具栏是菜单常用功能的快捷按钮,从左到右:

图标功能快捷键
💾 保存保存并创建检查点Ctrl/⌘ + S
➕ 插入在当前单元格下方插入新单元格B(命令模式)
✂ 剪切剪切选中的单元格X
📋 复制复制选中的单元格C
📌 粘贴在当前单元格下方粘贴V
▶ 运行运行当前单元格,移至下一个Shift + Enter
⏹ 停止中断 Kernel 执行I, I(命令模式)
🔄 重启重启 Kernel(清空所有变量)0, 0(命令模式)
⏩ 重启并运行全部重启后从头执行所有单元格
单元格类型下拉Code / Markdown / RawY / M / R

④ 单元格区域

Notebook 的核心区域,包含所有单元格。每个单元格左侧有一个 执行计数器

单元格执行输出截图
运行单元格后,左侧显示执行编号 [5][6],下方显示输出结果

编辑模式 vs 命令模式

这是 Jupyter 最重要的概念之一,直接影响快捷键的行为:

命令模式(Command Mode)

  • 单元格边框为 蓝色
  • Esc 进入
  • 快捷键作用于单元格整体
  • 可以:添加/删除/移动单元格
  • 按字母键 A/B/X/C/V 等操作

编辑模式(Edit Mode)

  • 单元格边框为 绿色
  • Enter 或双击进入
  • 快捷键作用于文本光标
  • 可以:输入和修改代码/文本
  • 正常的文本编辑键盘操作
INFO 这种双模式设计借鉴了 Vim 编辑器的思想。命令模式下你可以用单键快捷键快速操作 Notebook 结构;编辑模式下才能输入内容。刚开始可能会不习惯,但熟悉后效率极高。

Notebook 界面的隐藏功能

除了显而易见的菜单和工具栏,Notebook 还有一些不易发现但非常实用的功能:

单元格折叠(Cell Folding)
在 JupyterLab 中,点击单元格左侧的蓝色竖线可以折叠/展开单元格内容。对于长代码或输出,折叠后只显示第一行,节省屏幕空间。经典 Notebook 不支持此功能,但可以通过扩展(nbextensions)安装。
拖拽重排单元格
在 JupyterLab 中,可以直接拖动单元格左侧的边缘区域来重新排列单元格顺序,无需剪切粘贴。经典 Notebook 需要用 Edit → Move Cell Up/Down 或快捷键 Ctrl+Shift+↑/↓。
单元格执行计时
在 Settings → Advanced Settings Editor → Notebook 中,可以开启 recordTiming: true,每个单元格执行后会显示耗时(如"Executed in 2.3s")。这对性能分析非常有用,无需手动 %timeit。
单元格标签(Cell Tags)
右键单元格 → Add Tag,可以给单元格打标签(如"skip"、"test"、"important")。配合 nbconvert 或 papermill 使用,可以选择性导出或执行特定标签的单元格。例如:jupyter nbconvert --TagRemovePreprocessor.remove_cell_tags='{"skip"}' notebook.ipynb 可以导出时跳过所有标记为"skip"的单元格。

Kernel 状态指示器

工具栏右侧的 Kernel 名称(如 "Python 3 (ipykernel)")旁边有一个状态圆点:

状态含义
⭕ 空心圆Kernel 空闲,等待执行
⚫ 实心圆Kernel 正忙,正在执行代码
💀 断开Kernel 已断开连接,需要重新连接

重启 Kernel 对话框

重启 Kernel 对话框
点击"重启并运行所有单元格"时,Jupyter 会弹出确认对话框,防止误操作

重启 Kernel 会清空所有变量和模块的内存状态。对话框会提醒:"All variables will be lost"

执行计数器的意义

执行顺序 vs 文档顺序
执行计数器 [n] 中的数字记录的是这个 cell 是第几次被执行的(在当前 Kernel 会话中的全局顺序),而不是它在文档中的位置序号。如果你先运行第 5 个 cell,它的编号是 [1];再运行第 1 个 cell,它的编号是 [2]。这种设计让你可以从执行编号还原出实际的执行顺序,对调试非常有帮助。
[*] 表示正在等待
当一个 cell 显示 [*] 时,意味着它已被提交给 Kernel 执行,但 Kernel 还没有完成。这可能是因为:① 该 cell 本身在运行(如长时间计算);② 前一个 cell 还没运行完,该 cell 在队列中等待。Jupyter 的 Kernel 是单线程的——一次只能执行一个 cell,其余的排队等待。
为什么执行顺序很重要
Python 变量的值取决于执行顺序。例如:你先执行 x=1(编号[1]),后执行 x=2(编号[2]),再执行第一个 cell 时,x 仍然是 2(已被覆盖)。乱序执行导致的状态污染是 Notebook 最常见的 bug 来源。最佳实践:开发时随意执行,分析完成后用"Restart & Run All"验证从头到尾的可复现性。
危险操作:关闭标签页 vs 关闭并停止

直接关闭浏览器标签页只是关闭了界面,后台的 Kernel 进程仍在运行(继续占用内存)。如果你有多个 Notebook 同时运行,可能导致系统内存耗尽。正确做法:使用 File → Close and Halt(经典 Notebook)或在 JupyterLab 中右键点击 Notebook 标签选择"Shut Down Kernel",确保彻底停止 Kernel 进程。在主页的 Running 标签页可以看到并停止所有活跃的 Kernel。

Notebook 的执行模型与性能优化

单线程 Kernel 的队列机制
Jupyter Kernel 基于 IPython,一次只能执行一个 cell(即使是 async 代码,也在同一个事件循环中)。快速连续点击运行多个 cell 时,它们会进入执行队列,逐一处理。正在等待执行的 cell 显示 [*]。要"取消"队列中的 cell,需要中断 Kernel(Kernel → Interrupt),这会立即停止当前运行的 cell 并清空队列中的所有待执行 cell。
长时间运行任务的处理
对于需要几小时运行的任务(如模型训练、大文件处理),在 Notebook 中直接运行有断开连接的风险(网络中断、浏览器关闭)。推荐方案:① 使用 tqdm 进度条显示进度,关闭浏览器不影响 Kernel 运行;② 定期保存中间结果到文件(不要只在内存中);③ 对于跨天运行的任务,考虑在 Jupyter 内置终端中用 nohup 或 screen 运行独立 Python 脚本,更加稳健;④ JupyterLab 的自动重连机制可在短暂断连后恢复会话。

本章小结

本章核心要点
  • 界面四层结构:标题栏(文件名、Kernel 图标)→ 菜单栏(File/Edit/Run/Kernel)→ 工具栏(快捷按钮)→ 单元格区域(核心工作区)。熟悉各层的功能归属,找功能不再迷路。
  • 执行计数器:[ ] 未执行,[*] 正在执行/等待,[5] 第5次被执行(记录执行顺序而非文档位置)。通过执行编号可以还原实际执行顺序,是调试状态问题的关键线索。
  • 命令模式(蓝色)vs 编辑模式(绿色):Esc 进入命令模式(操作单元格结构:A/B/X/C/V/D/M/Y 等快捷键);Enter 进入编辑模式(输入内容:正常文本编辑)。同一按键在两种模式下有完全不同的效果。
  • Kernel 状态:空心圆 = 空闲,实心圆 = 执行中,断开图标 = 失去连接。Kernel 是单线程的,一次只执行一个 cell,其余的排队。
  • 正确关闭 Notebook:使用 File → Close and Halt,而不是直接关闭标签页——后者会留下占用内存的"僵尸 Kernel"进程。