
2.1.2 Jupyter Notebook简介及安装
Jupyter Notebook是一款开源网页程序。其主要应用于实时执行单段代码,契合Python这种脚本语言的运行方式。代码可以分开写入不同的cell(元件),单独执行。如图2.15所示,被方框框起来的部分属于同一个cell。
常用的cell有3种不同的类别——Code、Markdown和Raw cell。Code cell用于写代码,是添加新的cell时的默认类别,内容要求符合Python语言规范。在Code cell中执行print或其他附带输出的Python代码即可在该cell底部显示。Markdown cell用于插入文字和图片批注,同时可识别Markdown语言的特殊字符。Raw cell则会完全保留输入内容,不做任何编译。
Jupyter Notebook允许镶嵌式文字、表格和图像展示,如图2.15所示,让代码分享变得更直白易懂。拥有相同权限的用户可以对同一Notebook进行改写,方便团队间的协作。
接下来通过几个例子,对比一下使用Jupyter Notebook和传统的本机运行.py文件。
第1个差异是本机上运行的Python脚本需要整个.py文件同时运行,且运行完成后变量再无法找回。这样的不便在于,程序员无法立刻得到片段代码的输出。使用Python进行数据分析时,由于数据量普遍较大,每一步骤的运行时间也相应增加。若将所有步骤集合在同一.py文件中,然后执行整个文件,程序员将无法及时地根据脚本进度做出相应调整。举个具体的例子,数据分析前需要读取数据,假设这个过程花费一分钟。为了对读取的数据有一个初步的认知,我们可能会让脚本输出数据的长度、内容概述、数据类别等。若使用本机运行.py文件,脚本输出相应信息后将会自动退出。这时如果想获得数据的另一项信息或开始清理数据,则需要在.py文件中加入相应代码后重新执行脚本。这意味着重新花费一分钟读取数据。而使用Jupyter Notebook,只要不主动终结Notebook的运行,数据读取成功后便会一直存储在分配的变量中。而后可在新的一栏中,在无须重新读取数据的情况下写入新的脚本,输出数据的各类信息或开始清理数据。

图2.15 cell示例(图源:Jupyter官网)
如果在命令行使用过IPython,可能会觉得Jupyter Notebook的运行模式与之有所相似,但不同于IPython,Jupyter Notebook将脚本存储于一个.ipynb文件中,可供二次使用和分享。
第2个差异是输出格式的差异。本机上运行的.py文件产出的图片信息往往以窗口的方式弹出,或直接在命令行界面做图。窗口弹出不利于整理图像与代码之间的联系,特别是当代码输出多张图片时;命令行界面则本质上不适合做出高品质图表。Jupyter Notebook的镶嵌式展示可以将表格图片放置在相应代码附近。许多库也专门为Jupyter Notebook这类网页Python执行软件做过优化,如Matplotlib的图表绘制和Pandas的DataFrame打印,皆与本机中IPython不同。如Matplotlib在IPython中执行.plot()会弹出窗口,而在Jupyter Notebook中执行则会在相应的Code cell下方直接绘制。Pandas的比对将在2.1.3节中讲解。
第3个差异体现在分享或演示代码时。在团队内分享普通的.py文件往往需要大量的注释,因为大段的代码难以阅读。另外,.py文件本质上不太符合人类习惯阅读的格式。使用Jupyter Notebook的cell可以合理区分模块,并在模块之间加入文字和图片注解。如果是向不直接触碰代码的人演示——例如项目管理者,则更需要最大程度地优化编排。这也是Jupyter Notebook取名精巧的地方,它的格式如同一个符合人类习惯阅读的笔记本,其中穿插的代码及其输出可供使用者追溯笔记本内所述结果的运作原理。
Jupyter的官网子域(https://Jupyter.org/install.html)中提供了使用conda下载Jupyter Notebook的方法。
回到命令行界面,切换到test环境,执行:

收到:

指示时输入y,即可在新建的test环境内安装Jupyter Notebook。下载完成后执行Jupyter Notebook,将在网页中弹出一个显示主机根目录(Root directory)中所有文档及文件夹的列表。
还通过Anaconda-Navigator的图像界面直接安装。由于Jupyter Notebook在数据科学这一领域十分常用,Anaconda-Navigator的主页中设置了安装快捷键。这里需要注意一点,图像界面重启后会默认进入base环境,因此在安装前要注意通过顶部Applications on后面的下拉式菜单事先切换到test环境中。如图2.16所示,单击Notebook下的Install按钮即可下载。下载完成后,Notebook下方的Install会变成如VS Code下方一样的Launch(启动)。单击Launch按钮将与在命令行中执行Jupyter Notebook产生同样的效果——弹出网页窗口列表。

图2.16 下载Jupyter Notebook
可以通过网页列表中的文件夹名称到达一个想要存储项目代码的地方。如图2.17所示,笔者将会把以下用于示范的代码放入桌面上一个名为教学的文件夹中。
单击右上方的New→Python 3,可以创建新的Python Notebook。在这里也可以单击Folder建立新的文件夹,单击Text File建立新的.txt文件,或单击Terminal打开一个连接本机服务器的网页终端。

图2.17 新建Python Notebook
新建的Python Notebook的文件扩展名为.ipynb,在Jupyter中打开新建的Python Notebook文件,如图2.18所示。文件默认名为Untitled,也就是未命名,单击左上角文件名所在区域可为文件改名。

图2.18 命名新建Notebook
文件顶部是一排用于操作cell的工具,下拉式菜单可以用来切换一个cell的类别。图2.19所示是之前提到的不同类别的cell。Code cell和Raw cell单击即可编辑,而Markdown cell编译后想要重新编辑需要双击cell。

图2.19 不同类别的cell
下面介绍几个基本的按键。图2.20所示的加号工具按钮用来添加新的cell,单击后会在当前cell下方添加新的空白Code cell。
图2.21所示的裁剪工具按钮用来删除当前选中的cell。

图2.20 添加新的cell

图2.21 删除选中的cell
如果想要恢复被删除的cell,单击菜单中Edit→Undo Deleted Cells即可恢复上一次删除的cell,如图2.22所示。

图2.22 恢复删除的cell
单击图2.23所示的复制工具按钮可以用来复制选中的cell。

图2.23 复制选中的cell
图2.24所示的粘贴工具按钮用来粘贴上一次复制的cell,粘贴位置将在当前选中cell的下一格。注意,若使用裁剪键删除cell后没有使用过复制键,则上一次裁减的cell会被存储为待复制的cell。可以运用这一特质移动距离目的地较远的cell。

图2.24 粘贴复制的cell
图2.25所示的上下两个工具按钮可用来移动距离目的地较近的cell,它们会分别将选中的cell向上或向下移动一格。
图2.26所示的Run工具按钮用来执行单个cell。使用快捷键Shift+Enter可以达到同样的效果。

图2.25 上下移动cell

图2.26 执行单个cell中代码
图2.27所示的停止工具按钮用来暂停还在运行的cell。

图2.27 暂停cell中运行的代码
图2.28所示的重启工具按钮会清除所有的变量,Code cell前面记录运行顺序的数字也会在下一次运行一个cell的时候重新从1开始计数。

图2.28 重新启动Notebook
使用这一重启工具按钮,Code cell的输出不会被清除,因此如果在某个cell中打印前面cell定义过的变量,这一输出仍会出现在笔记本内,如图2.29所示,但是重启后若跳过图2.29中的第1行定义直接执行第2行,会得到NameError,因为此时变量a还未被定义。
若需要在重启的同时清理全部输出,单击Kernel→Restart&Clear Output,如图2.30所示。

图2.29 重启后输出保留

图2.30 重启并清除输出
图2.31所示的重启工具按钮将在重启的同时执行所有cell。

图2.31 重启并执行所有cell