Chapter 01 / 10

认识 Jupyter Notebook

了解什么是 Jupyter、为什么数据科学家离不开它,以及 .ipynb 格式的设计哲学

什么是 Jupyter Notebook

Jupyter Notebook 是一种基于 Web 的交互式计算环境,允许你在同一个文档中混合编写代码、执行代码、查看输出、撰写文本说明和插入图表。

名称 "Jupyter" 来源于三种核心编程语言:Julia、Python、R,但现在已支持 40+ 种语言的 Kernel。

INFO Jupyter Notebook 由 IPython 项目演化而来。2014 年,Fernando Pérez 等人将 IPython Notebook 独立出来,并重命名为 Jupyter Project。

核心理念:文学化编程

Jupyter 实践了 Donald Knuth 提出的"文学化编程"(Literate Programming)思想——代码应该像文章一样可读,附带完整的说明与推导过程。

传统的 Python 脚本 .py,运行后只能在终端看到输出,代码和结果是分离的。而 Jupyter Notebook 让代码、输出、文字说明、图表全部内联在同一个文档中,形成完整的叙事链条。

传统 Python 脚本 (.py)

  • 纯文本代码文件
  • 需运行整个脚本
  • 输出打印到终端
  • 图表弹出窗口
  • 难以夹杂文字说明

Jupyter Notebook (.ipynb)

  • 代码 + 输出 + 文档一体
  • 可逐个单元格执行
  • 输出内联显示
  • 图表直接嵌入文档
  • 支持 Markdown 和 LaTeX

典型使用场景

数据探索与分析
逐步加载数据、清洗、统计描述、可视化,边做边记录每步的发现。
机器学习实验
训练模型、调参、对比不同方案,每次实验的结果直接保存在 Notebook 中。
学术报告与论文附件
将分析过程和代码一同发布,让他人可以复现结果。
教学演示
老师在课堂上边讲边运行代码,学生直接打开相同的 Notebook 动手操作。
数据新闻与可视化报道
《纽约时报》、FiveThirtyEight 等媒体发布带完整分析过程的 Notebook。

.ipynb 文件格式

Notebook 文件以 .ipynb(IPython Notebook)为扩展名,本质是一个 JSON 文档

// demo.ipynb 的简化结构
{
  "nbformat": 4,
  "metadata": {
    "kernelspec": { "name": "python3", "display_name": "Python 3" },
    "language_info": { "name": "python", "version": "3.12.0" }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "source": "# 我的分析报告\n\n这是一个 **Markdown** 单元格。"
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "source": "print('Hello, Jupyter!')",
      "outputs": [{
        "output_type": "stream",
        "text": "Hello, Jupyter!\n"
      }]
    }
  ]
}
TIP 由于 .ipynb 是纯文本 JSON,可以用 git 进行版本控制。但因为输出内容(尤其是 Base64 图片)会让 diff 很难阅读,建议使用 nbstripout 工具在提交前自动清除输出。

Jupyter 生态系统

Jupyter 不只是一个工具,而是一个完整的生态:

组件用途
Jupyter Notebook经典界面,适合单文件分析
JupyterLab下一代 IDE 界面,多面板、文件管理
JupyterHub多用户服务器,适合团队和教学
nbconvert将 Notebook 导出为 HTML/PDF/Python
ipywidgets交互式 UI 控件(滑块、按钮等)
nbviewer在线渲染 Notebook(无需安装)
Google ColabGoogle 托管的云端 Jupyter 环境

Kernel 是什么

Kernel(内核)是在后台运行的编程语言进程,负责执行单元格中的代码并返回结果。

Notebook 界面(浏览器)通过 WebSocket 与 Kernel 通信。这意味着:

# 在一个单元格中定义变量
x = 42

# 在另一个单元格中可以直接使用
print(x)  # 输出: 42
WARNING 变量的值取决于执行顺序,而不是单元格在文档中的顺序。如果你反复修改并重新运行某个单元格,可能会产生意想不到的变量状态。养成定期使用 "Restart & Run All" 的习惯,确保结果可复现。

本章小结