Jupyter notebook 是什么?
欢迎学习本课程——如何使用 Jupyter notebook。Jupyter notebook 是一种 Web 应用,能让用户将说明文本、数学方程、代码和可视化内容全部组合到一个易于共享的文档中。例如,不久前我共享了我最爱的一个 Jupyter notebook ,它分析了 LIGO 实验探测到的两个碰撞的黑洞所发出的引力波。你可以下载数据,运行 notebook 中的代码,重复整个分析,实际上等于你自己探测引力波!
Jupyter Notebook 已迅速成为处理数据的必备工具。其用途包括数据清理和探索、可视化、机器学习和大数据分析。我为我的个人博客创建了一个 notebook 示例,它展示了 notebook 的许多特点。这项工作通常在终端中完成,也即使用普通的 Python shell 或 IPython 完成。可视化在单独的窗口中进行,而文字资料以及各种函数和类脚本包含在独立的文档中。但是,notebook 能将这一切集中到一处,让用户一目了然。
GitHub 上也直接支持 Jupyter notebook 的渲染。借助此出色的功能,你可以轻松地共享工作。http://nbviewer.jupyter.org/ 也会提供 GitHub 代码库中的 notebook ,以及存储在其他地方的 notebook。
文学化编程
notebook 是 Donald Knuth 在 1984 年提出的文字表达化编程的一种形式。在文字表达化编程中,直接在代码旁写出叙述性文档,而不是另外编写单独的文档。用 Donald Knuth 的话来说:
让我们集中精力向人们解释我们希望计算机做什么,而不是指示计算机做什么。
归根到底,代码是写给人看到,不是写给计算机看的。notebook 恰恰提供了这种能力。你能够直接在代码旁写出叙述性文档。这不仅对阅读 notebook 的人很有用,而且对你将来回头分析代码也很有用。
说点题外话:最近,文字表达化编程这个概念已经发展成为一门完整的编程语言,即 Eve。
notebook 如何工作
Jupyter notebook 源自 Fernando Perez 发起的 IPython 项目。IPython 是一种交互式 shell,与普通的 Python shell 相似,但具有一些很好的功能(例如语法高亮显示和代码补全)。最初,notebook 的工作方式是,将来自 Web 应用(你在浏览器中看到的 notebook)的消息发送给 IPython 内核(在后台运行的 IPython 应用程序)。内核执行代码,然后将结果发送回 notebook。当前架构与之相似,具体见下图。
核心是 notebook 的服务器。你通过浏览器连接到该服务器,而 notebook 呈现为 Web 应用。你在 Web 应用中编写的代码通过该服务器发送给内核,内核运行代码,并将结果发送回该服务器。之后,任何输出都会返回到浏览器中。保存 notebook 时,它将作为 JSON 文件(文件扩展名为 .ipynb
)写入到该服务器中。
此架构的一个优点是,内核无需运行 Python。由于 notebook 和内核分开,因此可以在两者之间发送任何语言的代码。例如,早期的两个非 Python 内核分别是 R 语言和 Julia 语言。使用 R 内核时,用 R 编写的代码将发送给执行该代码的 R 内核,这与在 Python 内核上运行 Python 代码完全一样。IPython notebook 已被改名,因为 notebook 变得与编程语言无关。新的名称 Jupyter 由 Julia、Python 和 R 组合而成。如果有兴趣,不妨看看可用内核的列表。
另一个优点是,你可以在任何地方运行 notebook 服务器,并且可通过互联网访问服务器。通常,你会在存储所有数据和 notebook 文件的自有计算机上运行服务器。但是,你也可以在远程计算机或云实例(如 Amazon 的 EC2)上设置服务器。之后,你就可以在世界上任何地方通过浏览器访问 notebook。
安装 Jupyter notebook
目前,安装 Jupyter 的最简单方法是使用 Anaconda。该发行版附带了 Jupyter notebook。你能够在默认环境下使用 notebook。
要在 conda 环境中安装 Jupyter notebook,请使用 conda install jupyter notebook
。
也可以通过 pip 使用 pip install jupyter notebook
来获得 Jupyter notebook。
启动 notebook 服务器
要启动 notebook 服务器,请在终端或控制台中输入 jupyter notebook
。服务器会在你运行此命令的目录中启动。这意味着任何 notebook 文件都会保存在该目录下。你通常希望在 notebook 文件所在的目录中启动服务器,不过你也可以在文件系统中导航到 notebook 文件所在的位置。
运行此命令时(请自己试一下!),服务器主页会在浏览器中打开。默认情况下,notebook 服务器的运行地址是 http://localhost:8888
。该地址的含义是:localhost
表示你的计算机,而 8888
是服务器的通信端口。只要 notebook 服务器仍在运行,你随时都能通过在浏览器中输入 http://localhost:8888 返回到 web 页面中。
如果同时启动了另一个 notebook 服务器,新服务器会尝试使用端口 8888
,但由于此端口已被占用,因此新服务器会在端口 8889
上运行。之后,你可以通过 http://localhost:8889
连接到新服务器。每个额外的 notebook 服务器都会像这样增大端口号。
如果你尝试启动自己的服务器,它应类似以下所示:
你可能会看到上面列表中的一些文件和文件夹,具体取决于你在哪里启动服务器。
在右侧,你可以点击“New”(新建),创建新的 notebook、文本文件、文件夹或终端。“Notebooks”下的列表显示了你已安装的内核。由于我在 Python 3 环境中运行服务器,因此列出了 Python 3 内核。你在这里看到的可能是 Python 2。我还安装了用于 Scala 2.10 和 2.11 的内核,因此它们出现在列表中。
如果在 conda 环境中运行 Jupyter notebook 服务器,则你还能选择环境中任何其他的内核(见下图)。要创建新的 notebook,请点击你要使用的内核
顶部的选项卡是 Files(文件)、Running(运行)和 Cluster(集群)。Files(文件)显示当前目录中的所有文件和文件夹。点击 Running(运行)选项卡会列出所有正在运行的 notebook。可以在该选项卡中管理这些 notebook。
过去,在 Clusters(集群)中创建多个用于并行计算的内核。现在,这项工作已经由 ipyparallel 接管,因此该选项卡如今用处不多。
如果在 conda 环境中运行 notebook 服务器,则你还能访问以下所示的“Conda”选项卡。可以通过该选项卡管理 Jupyter 中的环境。你可以执行多种操作,例如创建新的环境、安装包、更新包、导出环境。
关闭 Jupyter
通过在服务器主页上选中 notebook 旁边的复选框,然后点击“Shutdown”(关闭),你就可以关闭各个 notebook。但是,在这样做之前,请确保你保存了工作!否则,在你上次保存后所做的任何更改都会丢失。下次运行 notebook 时,你还需要重新运行代码。
通过在终端中按两次 Ctrl + C,可以关闭整个服务器。再次提醒,这会立即关闭所有运行中的 notebook,因此,请确保你保存了工作!
notebook 界面
创建新的 notebook 时,你会看到如下所示的界面:
请随意尝试和四处浏览一下。
你会看到外框为绿色的一个小方框。它称为单元格。单元格是你编写和运行代码的地方。你也可以更改其类型,以呈现 Markdown(一种常用于编写 Web 内容的格式化语法)。我会在后面更详细地介绍 Markdown。在工具栏中点击“Code”,将其改为 Markdown,然后改回来。小型的播放按钮用于运行单元格,而向上和向下的箭头用于上下移动单元格。
运行代码单元格时,单元格下方会显示输出。单元格还会被编号(左侧会显示 In [1]:
)。这能让你知道运行的代码和运行顺序(如果运行了多个单元格的话)。在 Markdown 模式下运行单元格会将 Markdown 呈现为文本。
工具栏
从左侧开始,工具栏上的其他控件是:
- 软盘符号表示“保存”。请记得保存 notebook!
+
按钮用于创建新的单元格- 然后是用于剪切、复制和粘贴单元格的按钮。
- 运行、停止、重新启动内核
- 单元格类型:代码、Markdown、原始文本和标题
- 命令面板(见下文)
- 单元格工具栏,提供不同的单元格选项(例如将单元格用作幻灯片)
命令面板
小键盘符号代表命令面板。点击它会弹出一个带有搜索栏的面板,供你搜索不同的命令。这能切实帮助你加快工作速度,因此你将无需使用鼠标翻查各个菜单。你只需打开命令面板,然后键入要执行的操作。例如,如果要合并两个单元格
更多事项
顶部显示了标题。点击它可以将 notebook 重命名。
右侧是内核类型(在我的例子中是 Python 3),旁边是一个小圆形。在内核运行单元格时,会填充这个小圆形。对于大多数快速运行的操作,并不会填充它。它是一个小型指示器,在代码会运行较久时让你知道其实际是在运行中的。
工具栏包含了保存按钮,但 notebook 也会定期自动保存。标题右侧会注明最近一次的保存。你可以使用保存按钮手动进行保存,也可以按键盘上的 Esc
,然后按 s
。按 Esc
键会变为命令模式,而 s
是“保存”的快捷键。我会在后面介绍命令模式和快捷键。
在“File”(文件)菜单中,你可以选择多种格式进行 notebook 的下载。通常,你会希望将它作为 HTML 文件下载,以便与不使用 Jupyter 的其他人共享。也可以将 notebook 作为普通的 Python 文件下载,此时所有代码都会像平常一样运行。要在博客或文档中使用 notebook,Markdown 和 reST 格式很合适。
Markdown 单元格
如前所述,单元格也可用于以 Markdown 编写的文本。Markdown 是格式化语法,可让你加入链接、将文本样式设为粗体或斜体和设置代码格式。像代码单元格一样,按 Shift + Enter 或 Ctrl + Enter 可运行 Markdown 单元格,这会将 Markdown 呈现为格式化文本。加入文本可让你直接在代码旁写出叙述性文档,以及为代码和思路编写文档。
你可以在此处查找文档,但我会提供简短的入门文档。
标题
要编写标题,可在文本前放置井号,即 #
(英文读作 pound、hash 或 octothorpe)。一个 #
呈现为 h1
标题,两个 #
是 h2 标题,依此类推。类似以下所示:
# Header 1