- Python极简讲义:一本书入门数据分析与机器学习
- 张玉宏
- 2975字
- 2020-08-27 17:22:02
1.6 文学化编程—Jupyter
对于初学者来说,可以采用Jupyter Notebook(以下简称Jupyter)来完成代码编写和文档说明。为什么要采用Jupyter呢?这里面大有讲究。
1.6.1 Jupyter的由来
在介绍Jupyter之前,我们先介绍一位图灵奖得主、斯坦福大学终身教授—Donald Knuth(高德纳)。这位高德纳和我们今天要介绍的Jupyter又有什么关系呢?关系自然是有的!高德纳提出了一个至今看来仍然很有吸引力的编程方式—文学化编程(Literate Programming)。
传统的编程方式,让人们完全“屈就”于计算机的逻辑来编写代码。与此相反的是,文学化编程让人们能按照自己的思维逻辑来开发并描述程序。
简单来说,文学化编程的读者是人,而非机器。
这种方式的转换,让我们从仅写出让机器读懂的代码,过渡到了向人解释如何让机器实现我们的想法。这种解释的内容,除了包括让机器识别的“中规中矩”的代码,还有人自己“喜闻乐见”的叙述性的文字、图表及公式等。而且这些代码的运行和结果展示,并不需要离开当前文档描述的平台。也就是说,文学化编程支持现场交互式呈现。如此一来,这不正是数据分析人员所需要的编程风格吗?!
是的,这种编程风格非常酷!如果说高德纳提出了文学化编程的梦想,那么Jupyter就是使“梦想成真”的一种具体方法。Jupyter可以让我们“左手程序员,右手作家”的梦想更加趋于真实。
Jupyter脱胎于IPython项目。IPython是一个Python的交互式shell,它比默认的Python shell要好用很多。而IPython正是Jupyter的内核所在,我们可以理解为,Jupyter是网页版的IPython。
1.6.2 Jupyter的安装
事实上,前面我们安装Anaconda时,Jupyter已被默认安装了(这也是我们选择安装Anaconda的重要原因,它会帮我们把常用的库“全家桶式”地安装完毕)。如果你的环境中的确没有安装它,那么在命令行输入如下命令即可安装。
下面,我们先创建一个名为“tf-notebook”的目录,用于存放Jupyter的有关文档,然后在控制台用“jupyter notebook”命令启动Jupyter的服务器,相关指令如下所示。
②在Windows系统中,还可以在【开始】→【所有程序】→【Anaconda】菜单栏中找到Jupyter Notebook的启动按钮。
其中第3条指令将在默认的网页浏览器中开启一个新的工作空间。如果想要创建新笔记,用鼠标单击页面右上角的“New”按钮,然后选择Python 3即可,如图1-14所示。
图1-14 创建新笔记
新创建的笔记自动打开,如图1-15所示。此时,笔记并没有被命名,所以被系统自动命名为“Untitled1”(未命名)。
图1-15 新创建的Jupyter笔记
单击“Untitled1”,此时会弹出重命名对话框,如图1-16所示,在文本框中输入合适的文件名(如myFirstBook),然后单击“Rename”(重命名)按钮,即可完成笔记的重命名。Jupyter笔记文档的扩展名为.ipynb。
图1-16 Jupyter笔记重命名对话框
在图1-15中,我们注意到左边有一个“In[ ]:”标识,它提示我们这是一个输入代码的区域,我们可以在其中输入任意合法的Python语句。
1.6.3 Jupyter的使用
在如图1-15所示的代码单元格(cell)中可以输入相应的代码或文档。在Jupyter笔记中,有两种单元格,即代码单元格和文本单元格。每个单元格都有两种模式,即编辑模式(Edit mode)和命令模式(Command mode)。这种分类有点类似于UNIX系统中的Vim编辑器。在编辑模式下,我们可以在当前单元格输入文本或文档,当前单元格的边框呈现绿色,最左侧的边框会被加粗显示,如图1-17所示。
图1-17 处于编辑模式下的代码单元格边框
我们可以按Esc键,将编辑模式切换为命令模式。在命令模式下,无法输入代码或文档,此时可输入很多有用的快捷键,如按A键表示向上建立一个单元格,按B键表示向下建立一个单元格,按DD(连续按两个D)键表示可删除当前单元格等,更多快捷键功能可参考Jupyter中【Help】菜单栏下的Keyboard Shortcuts选项,单击Keyboard Shortcuts选项后,会显示如图1-18所示的常用快捷键。记住常见的快捷键,可大大提高我们的开发效率。
图1-18 Jupyter中的常用快捷键
下面我们尝试在代码单元格中运行一些简单的代码语句,来感受一下Jupyter的风格。例如,在图1-19所示的编号为In[1]的代码单元格中输入“1+1”,然后按Shift+Enter组合键或者用鼠标单击图1-17中的▶|Run按钮,即可运行这段代码,Out[1]输出的结果为2。按Shift+Enter组合键的好处在于,除了能运行本单元格的代码,还会自动创建下一个单元格In [2],我们可以分别在In [2]处定义一个变量“a=10”,在In [3]处输入“a+1”,于是在Out[3]处就会输出结果11。
图1-19 在Jupyter中输入代码
当然,我们可以一次性在代码单元格中输入大段代码,如【范例1-2】所示。
【范例1-2】利用Matplotlib包绘图(plot.py)
我们暂不解释上述代码。在Jupyter的某个代码块(code cell)中输入上述代码后,同时按下Shift+Enter组合键运行这段代码,运行结果如图1-20中的内嵌图片所示。我们还可以用鼠标单击Jupyter中的View菜单,选择Toggle Line Number(切换到行号),显示代码框中的行号。
图1-20 在Jupyter中运行代码
上面我们简单讲解了Jupyter的基本用法。如果Jupyter的功能仅限于此,那它和普通的IDE开发环境就没有什么本质上的区别。事实上,Jupyter的“文学化编程”到此并没有体现出来。那如何才能体现呢?这就要用到另外一种单元格—Markdown单元格。
1.6.4 Markdown编辑器
先来简单介绍一下Markdown。Markdown是一种轻量级的可使用普通文本编辑器编写的标记语言,由约翰·格鲁伯(John Gruber)于2004年创建。Markdown通过简单的语法标记,能使普通文本内容具备一定的格式。由于它的功能比纯文本编辑器强大很多,因此也有很多人用它来撰写文档或博客,例如GitHub、Matplotlib等网站就用它来呈现文档,知乎、CSDN及云栖社区等社区网站也支持Markdown格式的博客撰写。
在Jupyter的文本编辑单元格中,采用的就是Markdown的语法规范。在这个Markdown单元格中,我们可以设置文本格式,插入链接、图片甚至数学公式(类似于LaTeX),如图1-21所示。同样使用Ctrl+Enter组合键运行Markdown单元格即可显示格式化的文本。
图1-21 在Jupyter中添加Markdown单元格
在图1-21中,我们按照标号次序,❶先添加一个单元格(+),❷选择模块位置上移(↑),❸单击小按钮,选择单元格格式—Markdown,❹在Markdown单元格中输入我们要描述的文档,通过Markdown的特定语法让这个文档图文并茂。关于Markdown的具体用法,请读者自行参考相关文献。这里仅简单解释一下,在Markdown中,一个“#”表示一级标题,两个“#”表示二级标题,以此类推,Jupyter Notebook中共提供6级标题。需要注意的是,“#”与标题正文之间需要用一个空格隔开,否则Jupyter无法正确解析。
在文本编辑块中,按下Ctrl+Enter组合键即可格式化显示该段文本,如图1-22所示。于是,图文+代码并茂的文档便呈现在我们面前。如果我们想再次编辑对应的Markdown单元格,只需用鼠标选中对应的单元格,然后直接按回车键即可进入编辑模式。
图1-22 格式化显示Markdown文本
代码单元格和Markdown单元格是可以自由切换的。Jupyter默认添加的单元格为代码单元格,如果想切换,除了在图1-21所示的第❸个按钮处进行切换,还可以在编辑模式下按Esc键脱离编辑模式,进入命令模式,然后按M键(即Markdown的首字母)把代码单元格变成Markdown单元格。
Jupyter中的Markdown和GitHub中Markdown完全一致,我们完全可以借鉴GitHub中的参考资料来编写文档。
丰富多彩的Markdown还提供了其他功能,如设置加粗、斜体,设置删除线,添加列表等,下面我们进行简单介绍。
在Markdown单元格中,如果我们想加粗某段文字,可以使用前后两个星号“**”包围这段文字,如图1-23所示。
图1-23 在Markdown中加粗文字
按Shift+Enter组合键执行命令,加粗的文字如图1-24所示。
图1-24 显示加粗文字
类似地,我们还可以对文字设置斜体、删除线、加粗斜体混合,以及引用文字等格式,如图1-25所示。
图1-25 利用Markdown对文字进行格式设置
按Shift+Enter组合键分别执行上述Markdown单元格,格式化显示的文本如图1-26所示。
图1-26 格式化显示的文本
我们还可以在一行或多行间使用“-”和“*”创建项目列表形式。此外,还能使用1、2、3等数字生成有序列表。需要注意的是,上述字符或编号后面均要跟一个空格,以示与正文隔开,如图1-27所示。
图1-27 在Markdown单元格中使用序号
同样,按Shift+Enter组合键分别执行上述Markdown单元格,格式化显示的序号如图1-28所示。
图1-28 格式化显示的序号