Jupyter Notebook作为Anaconda套件里受到广泛关注的应用,自然有其独特的魅力。要了解其魅力,我们先从“文学编程( Literate programming)”说起。
传统的结构化编程使人们花费大量的力气让我们的代码顺应计算机的逻辑顺序,指导计算机做事,而文学编程则是让我们集中精力向人类解释我们需要计算机做什么,因此更顺应我们的思维逻辑。
由于我们面向的对象从计算机变成了人类,因此如果我们仅仅展示晦涩难懂的代码,那可能很少有人有足够的耐心去充分了解我们所做的工作。此时,叙述性的文字、可视化的图表将会为我们的阐述过程增添不少色彩。而这些,在Jupyter Notebook中我们都可以看到。
Jupyter Notebook是一种Web应用,也是一个交互式笔记本,它能让用户将说明文本、数学方程、代码和可视化内容全部组合到一个易于共享的文档中,非常方便研究、展示和教学。数据科学家可以在上面创建和共享自己的文档,从实现代码到全面报告,Jupyter Notebook大大简化了开发者的工作流程,帮助他们实现更高的生产力和更简单的多人协作。
在原始的 Python shell 与 IPython 中,可视化在单独的窗口中进行,而文字资料以及各种函数和类脚本包含在独立的文档中。但是,Jupyter Notebook能将这一切都集中整合起来,让用户一目了然。它是文学编程这一理念的实践者,因为它对阐述风格的卓越追求,像是一众“程序猿”里的“散文家”,生动明亮,趣味横生。
1 Notebook的优势
除了带有浓厚的文学气质以外,选择Jupyter Notebook进行数据科学工作还有很多优势。
● 适用于进行数据分析报告
Jupyter Notebook对于文本、代码、可视化内容的整合使它在进行数据分析报告时有极大的优势,既能够使报告者的思路清晰顺畅,也能够使接收者更直观清晰地了解主要内容。
● 支持多语言编程
Jupyter是从Ipython应用发展而来的,而其名字的变化就很好地表明其支持的语言在不断扩张的过程,Jupyter是Julia、Python以及R语言的组合,而现在它支持的语言已经超过40种。
● 用途广泛
Jupyter Notebook能够完成多种数据分析工作,包括数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等等。
● 分享便捷
Jupyter Notebook支持多种形式的分享。用户可以通过电子邮件、Dropbox、GitHub 和 Jupyter Notebook Viewer,将Jupyter Notebook分享给其他人。当然也可以选择将文件导出成HTML、Markdown、PDF等多种格式。
● 可远程运行
由于Jupyter Notebook是一种Web应用,因此在任何地点,只要有网络链接远程服务器,都可以用它来实现运算。
● 交互式展现
Jupyter Notebook不仅可以输出图片、视频、数学公式等,甚至还可以呈现一些互动的可视化内容,比如可缩放地图或可旋转三维模型。但这需要交互式插件的支持。
2 Notebook的界面
01Notebook Dashboard简介
打开Jupyter Notebook一般有两种方式,一种是从Anaconda Navigtor中点击进入,另一种则是从终端进入。
例1.2-2-1 打开Jupyter Notebook
通常来讲,打开Notebook意味着打开默认Web浏览器。此时我们会看到Notebook Dashboard,它会显示Notebook服务器启动目录中的笔记本、文件和子目录的列表,通过列表可以选择某一个notebook文件进入。
图1 Notebook Dashboard界面截图
从上图的Dashboard界面我们可以看到,它的顶部有Files、Running和Clusters三个选项。其中Files中列出了所有文件,Running显示了你已经打开的终端和笔记本,Clusters则是IPython parallel提供的。
如果想要将Notebook文件上载到当前的目录上,可以通过将文件拖动到Notebook列表或者点击右上角的【Upload】来实现。右上角同样有【New】按钮,点击它会显示四个选项:
● 文本文档(Text File):击会新建一个空白页面。它相当于一个文本编辑器,我们可以在上面输入任何字母、单词和数字,选择好编程语言后可以在上面写脚本。此外,它还提供查找和替换文件中的单词的功能。
● 文件夹(Folder):点击后其实是在编辑文件夹列表。我们可以创建一个新文件夹,把所需文档放进里面,或者修改文件夹的名称、删除文件夹。
● 终端(Terminal):其工作方式和Mac、Linux计算机上的终端一样,都是在Web浏览器中创建终端支持。点开后只需在其中输入Python,就可以写Python脚本。
● Python 2/3:点击后会创建一个基于Python2/3语言的Notebook编辑器,接下来我们会重点介绍它。
当某个Notebook文件正在运行时,在该文件名称前方的笔记本图标会显示为绿色,同时在右边会出现绿色的【Running】标记。如果想要关闭某个正在运行的Notebook文件,仅仅通过关闭该文件的页面是无法实现的,需要在Dashboard界面明确关闭它。
如果要对Notebook文件实现复制、重命名、关闭或删除操作,请选中它前面的复选框,此时Notebook列表的顶部会显示一系列控件,点击其中的按钮可以实现相应操作。
图2 选中某个Notebook文件前面的复选框后顶部会出现的控件
另外,点击顶部的【Running】按钮可以查看所有正在运行的Notebook文件,在此页面中也可以进行文件的关闭操作。
图3 Notebook的Running界面
02Notebook编辑器的用户界面组件
当我们打开一个新建的Notebook编辑器时,我们会看到笔记本名称、菜单栏、工具栏、模式指示器、内核指示器以及空代码单元格。即如下图的类似界面:
图4 新建Notebook的用户界面截图
●笔记本名称(Notebook name):页面顶部显示的名称(Jupyter徽标旁边),反映了.ipynb文件的名称。单击笔记本名称会弹出一个对话框,我们可以对它进行重命名。
● 菜单栏(Menu bar):菜单栏显示可用于操纵笔记本功能的不同选项。
● 工具栏(Toolbar):将鼠标悬停在某个图标上可以获取该图标的功能,通过单击图标可以快速执行笔记本中最常用的操作。
● 模式指示器(Mode Indicator):显示Notebook当前所处的模式,当没有图标显示时,表示处于命令模式;当出现小铅笔图标时,表示处于编辑模式。
● 内核指示器(Kernel Indicator):能够显示当前所使用的内核以及所处状态,当内核空闲时会显示为空心圆环,内核运行时会显示为实心圆形。
● 代码单元格(Code cell):默认的单元格类型,可在其中进行编程操作。
Notebook包含一系列单元格。单元格是多行文本输入字段,共有代码单元格、标记单元格、原生单元格三种类型。点击工具栏上的下拉菜单可以发现共有四个选项:
● 代码(Code):代码单元可以编写代码,具有完整的语法突出显示和选项卡补全。使用的编程语言取决于内核,默认内核(IPython)运行Python代码。
● 标记(Markdown):非常常见的轻量级标记语言,即指定应强调文本的哪些部分(斜体、粗体、表单列表等),用来为代码添加注释和结论。
● 原生 (Raw)NBConvert:一个命令行工具,提供了一个可以直接写入输出的位置。当通过NBconvert传输时,原生单元格以未修改的形式到达目标格式。例如,如果将完整的LaTeX键入到原生单元格中,该单元格在由NBconvert转换后仍由LaTeX呈现。
● 标题(Heading):添加标题,使文档看起来更干净整洁,它现在已经变成Markdown里的一个语法,用两个#表示。
Notebook中的单元格共有两种模式:
● 编辑模式(Edit mode):表示单元格处于可编辑状态,此时单元格中出现光标,单元格边框显示为绿色,模式指示器出现小铅笔图标。此种状态下可以进行代码的编写和更改等操作。
● 命令模式(Command mode):表示单元格处于可操作状态,此时单元格中没有光标,单元格左边显示为蓝色,边框为灰色,模式指示器中无图标。此种状态下无法针对单个单元格输入内容,但可以进行对整个Notebook进行操作,例如单元格的删除、切换等。
如果想要更详细地了解Notebook的用户界面,可以点击菜单栏之中的【Help】按钮,选择其中的【User Interface Tour】,相信动态的交互展示能够带给你一段美妙的用户界面之旅。
另外,如果在Dashboard的界面我们打开的是一个Markdown文件,那么我们将会进入一个文件编辑器(File Editor)的用户界面,由于文件编辑器的界面组件相对比较简单,此处不进行详细说明。
图5 Notebook的文件编辑器界面
03Notebook的键盘导航
Jupyter Notebook的模态用户界面经过优化之后可以有效地使用键盘。这是通过使用两组不同的键盘快捷键实现的:一组在编辑模式下处于激活状态,另一组在命令模式下处于激活状态。
最重要的键盘快捷键是进入编辑模式的【Enter】和进入命令模式的【Esc】。
由于在编辑模式下,键盘的大部分按键都主要用于单元格内容的输入,因此编辑模式中的快捷方式相对较少。而在命令模式下,由于不需要输入单元格内容,整个键盘都可以用于快捷方式,因此有更多地快捷操作可使用。点击菜单栏中的【Help】,选择【Keyboard Shortcuts】,可以了解在不同模式下的快捷操作。
图6 macOS系统下Keyboard Shortcuts界面
另外,如果想要自己设置快捷操作,可以在上图界面中点击右上角的【编辑快捷键】按钮进行快捷键更改,或者点击菜单栏中的【Help】,选择【Edit Keyboard Shortcuts】进行编辑。
对于快捷操作的学习,我们建议按以下顺序进行:
●基本导航:【enter】,【shift-enter】,【up/k】,【down/j】
● 保存Notebook:【s】
● 更改单元格类型:【y】,【m】,【1-6】,【t】
● 创建单元格:【a】,【b】
● 编辑单元格:【x】,【c】,【v】,【d】,【z】
● 内核操作:【i】,【0】(按两次)
3 Notebook的基本使用
为了给后续Python的编程学习打下一个良好的基础,此处对Notebook的基本使用操作进行简单介绍,主要包括:
● 运行代码 ● 停止运行 ● 结果输出 ● 魔术关键字 ● 文档存储及分享
1运行代码
前面已经说明,在编辑模式下,我们可以对代码单元格进行输入和运行代码的操作。
例1.2-3-1 输出Hello,world
要运行代码可以点击工具栏中的运行按钮,或者使用快捷键【Shift+Enter】,运行开始后单元格前方的中括号里会出现【】标记,同时在下方会产生一个新的空代码单元格。运行结束后,单元格前方的中括号里会显示运行的顺序,运行结果如下图所示。
*图7 输出Hello,world的运行结果
另外,还有两个快捷键也可用于代码的运行:
● 【Alt+Enter】 :运行当前单元格并在下方插入新的单元格。 ● 【Ctrl+Enter】 :运行当前单元格并进入命令模式,此时不会有新的单元格产生。
除此之外,点击菜单栏里的【cell】按钮,还可以选择运行所有单元格、运行以上/以下单元格等运行方式。
2停止运行
如果在代码的运行过程中发现代码错误或陷入死循环需要停止正在运行的代码,可以通过在命令模式下连续按下两次【i】键来实现,也可以点击工具栏中的正方形按钮进行停止。运行被强制停止后会出现KeyboardInterrupt的提示。
除此之外,还可以通过中断内核运行来实现此操作。内核是代码运行的单独进程,可以通过选择菜单栏之中的【Kernal】对内核进行中断、重启等操作。如果想要在一个Notebook里切换不同的Python版本,也可以进行内核切换。
在单元格中输入以下代码并运行,尝试用以上不同方法停止运行。
例1.2-3-2 停止运行
图8 代码停止运行后的结果
除此之外,还可以通过中断内核运行来实现此操作。
3结果输出
Notebook的所有输出都是在内核中生成的异步显示。举例来说,如果执行以下单元格,我们将会每隔0.5s看到输出一行新的内容。
例1.2-3-3 输出的异步显示
当所有内容都输出完成后,会看到以下结果:
图9 输入异步显示的最终结果
当输出的内容较多时,输出区域可以折叠。我们可以通过单击或双击输出结果左侧的活动区域来实现。当输出内容多到超过某个值时,输出会进行自动折叠。
图10 输出区域折叠示例
4魔术关键字
魔术关键字(magic keywords)是用于控制Notebook的特殊命令。它们在代码单元格当中运行,以【%】或者【%%】开头,【%】控制一行,【%%】控制整个单元。由于魔术关键字的用法很多,这里只介绍较为普遍的几个,更多用法可以参考魔术命令的官方文档。
例1.2-3-4 部分魔术关键字
5文档存储及分享
Notebook有自动存储的功能,存储是以.ipynb的格式存储为笔记本。如果想要改变存储的格式,可以在菜单栏的【file】中找到【Download】,然后可以选择将文档存储为Python、HTML、Markdown、LaTeX、PDF等多种格式。
另外,Notebook还有一个非常“酷炫”的功能是可以进行PPT的制作和展示,其所制成的PPT风格非常简单明晰。
在Notebook的菜单栏中选择【View】,然后点击【Cell Toolbar】,选择【Slideshow】,这时在文档的每个单元右上角都会显示出【Slide Type】的下拉菜单。通过选择不同的选项设置不同的类型,可以控制PPT的格式。Slide Type下共有5种类型:
● Slide:主页面,在PPT放映中通过按左右方向键进行切换。 ● Sub-Slide:子页面,在PPT放映中通过按上下方向键进行切换。 ● Fragment:碎片页面,一开始是隐藏的,按空格键或方向键后显示,实现动态效果。 ● Skip:跳过页面,在幻灯片中不显示的单元。 ● Notes:备注页面,作为演讲者的备忘笔记,不在幻灯片中显示。
当编写好幻灯片形式的Notebook之后,需要在终端中使用nbconvert来进行展示。
例1.2-3-5 以PPT形式打开Notebook文档