Python程序设计:人工智能案例实践
上QQ阅读APP看书,第一时间看更新

1.5 试用IPython和Jupyter Notebook

本节将以两种模式使用IPython解释器[1]

  • 交互模式中,输入少量的称为代码段的Python代码,并立即查看结果。
  • 脚本模式中,从扩展名为.py的文件(Python的缩写)加载代码并执行。此类文件称为脚本程序,它们通常包含比交互模式更长的代码段。

除了IPython解释器之外,本节还会介绍如何使用基于浏览器的编程环境Jupyter Notebook编写和执行Python代码[2]

1.5.1 使用IPython交互模式作为计算器

我们使用IPython交互模式来评估简单的算术表达式。

以交互模式进入IPython

首先,打开命令行窗口:

  • 在macOS系统中,从Applications文件夹的Utilities子文件夹打开一个Terminal。
  • 在Windows系统中,从开始菜单中打开Anaconda Command Prompt。
  • 在Linux系统中,打开系统的Terminal或shell(取决于Linux的发行版本)。

在命令行窗口中,键入ipython,然后按Enter键(或Return键),你会看到如下文字(内容取决于使用的平台和IPython的版本):

In [1]:是一个提示符,表示IPython正在等待输入。可以在此处输入?获得帮助或开始输入代码段。

评估表达式

在交互模式下,可以评估表达式:

键入45+72并按Enter键后,IPython读取该代码段,对其进行评估并在Out[1]位置输出结果[3]。然后,IPython显示提示符In[2],表明它正在等待输入第二个代码段。对于每个新代码段,IPython会令方括号中的数字加1。本书通常会在一章中的每一节将提示符设置为In[1],表明开始一个新的交互式会话。

下面评估一个更复杂的表达式:

Python使用星号(*)做乘法,使用正斜杠(/)做除法。与数学中的定义一样,括号可以强制改变运算顺序,因此先评估括号表达式(12.7-4),得到8.7。然后评估5*8.7,结果为43.5。接着评估43.5/2,得到结果21.75。最后,IPython将结果显示在Out[2]中。形如542的整数称为整型数;带小数点的数字,如12.743.521.75,称为浮点数

退出交互模式

可以通过下面的操作退出交互模式:

  • 在当前的In[]提示符后键入exit命令,然后按Enter键立即退出。
  • 按组合键“<Ctrl> + D”(或<control> + D),会提示“Do you really want to exit([y]/n)?”。y两侧的方括号表示它是默认响应,按Enter键提交默认响应并退出。
  • 按组合键“<Ctrl> + D”(或<control> + D)两次(仅限macOS和Linux)。

1.5.2 使用IPython解释器执行Python程序

在本节中,我们执行一个名为RollDieDynamic.py的脚本,该脚本的编写将在第6章介绍。.py扩展名表明该文件包含Python源代码。脚本RollDieDynamic.py模拟投掷一个六面骰子。它提供了一个彩色的动态可视化效果,可动态绘制骰子每个面出现的次数。

更改路径为本章的示例文件夹

脚本RollDieDynamic.py在本书的ch01源代码文件夹中。在“开始阅读本书之前”部分中提到,先将examples文件夹解压缩到用户账户的Documents文件夹中。本书的每一章都有一个名为ch##的文件夹,该文件夹中包含该章源代码,其中##是从0116的两位数章节编号。首先,打开系统的命令行窗口。接下来,使用cd(change directory)命令切换到ch01文件夹:

  • 在macOS / Linux系统中,键入cd~/Documents/examples/ch01,然后按Enter键。
  • 在Windows系统中,键入cd C:\Users\YourAccount\Documents\examples\ch01,然后按Enter键。

执行脚本

要执行脚本,在命令行中键入以下命令,然后按Enter键:

    ipython RollDieDynamic.py 6000 1

运行脚本会打开一个窗口显示可视化结果。数字6,000和1是掷骰子的次数和每次掷骰子的个数。在这个实例中,脚本会依次为每一个骰子更新图表6,000次。

对于一个六面骰子,点数1到6应“等概率”出现,即每个面朝上的概率都为1/6(或约等于16.667%)。如果投掷6,000次骰子,每个面朝上的数学期望大约为1,000次。与掷硬币一样,投掷骰子的结果也是随机的,因此可能会有某些点数出现的次数小于1,000,某些点数正好出现1,000次,还有某些点数出现超过1,000次。脚本随机生成骰子的点数,因此每次运行的结果会有所不同。依次将值1更改为100、1,000和10,000,观察脚本运行的结果可以发现,随着骰子个数的增加,每个点数出现的次数的百分比将无限趋近于16.667%,这就是“大数定律”的体现。下图是脚本执行期间的屏幕截图。

创建脚本

通常,可以在任何能够编辑文本的编辑器中创建Python源代码。在编辑器中可以键入程序、进行必要的更正并将其保存到计算机中。集成开发环境(IDE)提供支持整个软件开发过程的工具,例如编辑器、用于定位程序错误的调试器等。一些流行的Python IDE包括Spyder(随Anaconda一起提供)、PyCharm和Visual Studio Code。

执行时可能出现的问题

程序通常在第一次执行时无法正确运行。例如,程序可能会执行除以零(Python中的非法操作)的操作,这将导致程序提示错误消息。如果在脚本中出现这种情况,则需要返回编辑器进行必要的更正并重新执行脚本,以确定是否改正了错误。

类似除以零的错误发生在程序运行时,所以这些错误被称为运行时错误执行时错误致命的运行时错误会导致程序在没有成功完成其工作的情况下立即终止。非致命的运行时错误允许程序运行完成,但通常会产生不正确的结果。

1.5.3 在Jupyter Notebook中编写和执行代码

在“开始阅读本书之前”部分中安装的Anaconda Python发行版附带了Jupyter Notebook,这是一个基于浏览器的交互式编程环境,可以在其中编写和执行代码,也可以将代码与文本、图像和视频混合在一起。Jupyter Notebook是进行基于Python的数据分析研究和分享结果的首选编程环境,在科学界,特别是数据科学界得到了广泛的应用。此外,Jupyter Notebook正在支持越来越多的编程语言。

为方便起见,本书的所有源代码也在Jupyter Notebook中提供,使用时只需加载和执行即可。在本节中,我们将使用JupyterLab界面管理Notebook文件和Notebook使用的其他文件(如图像和视频等)。JupyterLab也可以方便地编写代码、执行代码、查看结果和调试代码等。

在Jupyter Notebook中编写代码与在IPython中编写代码没有太大差别,因为Jupyter Notebook默认使用IPython。在本节中,我们将创建一个Notebook,并将1.5.1节中的代码添加到其中执行。

在浏览器中打开JupyterLab

要打开JupyterLab,可在Terminal、shell或Anaconda命令提示符状态下进入ch01示例文件夹(如1.5.2节所述),键入以下命令,然后按Enter键(或Return键):

    jupyter lab

该命令将会在计算机上运行Jupyter Notebook服务器,然后在默认的Web浏览器中打开JupyterLab,将ch01文件夹中的内容显示在JupyterLab界面左侧的File Browser(000)选项卡中,如下所示。

Jupyter Notebook服务器使我们可以在Web浏览器中加载和运行Jupyter Notebook。在JupyterLab Files选项卡中,通过双击相应的文件可以在窗口的右侧(当前显示Launcher选项卡)显示文件内容。每个打开的文件都会在窗口的这一部分作为单独的选项卡显示。如果不小心关闭了浏览器,可以在Web浏览器中输入地址http://localhost:8888/lab重新打开JupyterLab。

新建一个Jupyter Notebook

在Jupyter Notebook的Launcher选项卡中,单击Python 3按钮创建名为Untitled.ipynb的新Jupyter Notebook,然后就可以在其中输入和执行Python 3代码。文件扩展名.ipynb是IPython Notebook的缩写(Jupyter Notebook的原始名称)。

更改Notebook文件名

将文件名Untitled.ipynb改为TestDrive.ipynb

1. 右键单击Untitled.ipynb选项卡,然后选择Rename Notebook...。

2. 将名称改为TestDrive.ipynb,然后单击RENAME。

现在,JupyterLab的顶部如下图所示。

评估一个表达式

单元格是Notebook的工作单元,可以在其中输入代码段。默认情况下,新Notebook只包含一个单元格,就是在TestDrive.ipynb的Notebook中看到的矩形框,不过也可以添加更多的单元格。在单元格的左侧,符号[]:是Jupyter Notebook在执行单元格显示单元格代码段编号的位置。单击单元格,然后键入表达式

    45 + 27

按组合键Ctrl + Enter(或Control + Enter)执行当前单元格的代码。JupyterLab在IPython中执行代码,然后在单元格下方显示结果。

添加并执行另一个单元格

下面,我们来评估一个更复杂的表达式。首先,单击Notebook左上角工具栏中的+按钮,在当前单元格下方添加一个新单元格。

单击新单元格,然后键入表达式

    5 * (12.7 - 4) / 2

按组合键Ctrl + Enter(或Control + Enter)执行单元格中的代码。

保存Notebook

如果对Notebook做了修改但尚未保存,Notebook选项卡中的000将变为000。要保存Notebook,选择JupyterLab的File菜单(不在浏览器窗口的顶部),然后选择Save Notebook。

各章示例提供的Notebook

为了方便起见,每章的示例都提供了可以立即执行的Notebook,但都没有显示输出。可以按照代码段逐个处理这些Notebook,并在执行每个代码段时查看输出的结果。

现在来看一下如何加载现有的Notebook并执行其单元格。首先,重置TestDrive.ipynb Notebook,删除它的输出和代码段编号,这将使Notebook返回到初始状态。然后,从Kernel菜单中选择Restart Kernel and Clear All Outputs...,单击RESTART按钮。当需要重新执行Notebook的代码段时,也可以使用上面的命令。Notebook如下图所示。

选择File菜单中的Save Notebook,然后单击TestDrive.ipynb选项卡的000按钮关闭Notebook。

打开并执行一个已有的Notebook

当需要从给定章节的示例文件夹中启动JupyterLab时,可以从该文件夹或它的任何子文件夹中打开Notebook。一旦定位到了需要的Notebook后,可以双击将其打开。现在再次打开TestDrive.ipynb Notebook。打开后,可以使用本节前面所述的方法单独执行每个单元格,也可以从Run菜单中选择Run All Cells立即执行Notebook中所有的单元格。Notebook将按顺序执行每一个单元格,并在每个单元格下方显示该单元格的输出。

关闭JupyterLab

使用完JupyterLab后,可以关闭其浏览器选项卡,然后在运行JupyterLab的终端、shell或Anaconda命令提示符中,按组合键Ctrl + C(或Control + C)两次。

JupyterLab提示

以下是使用JupyterLab进行工作的几个技巧:

  • 如果需要输入并执行许多代码段,可以使用组合键Shift + Enter代替组合键Ctrl + Enter(或Control + Enter),这样在执行完当前单元格后会在下面添加一个新单元格。
  • 当学习到后面的章节时,将在Jupyter Notebook中输入的一些代码段会包含多行代码。此时,可以在JupyterLab的View菜单中选择Show line numbers在单元格中显示行号。

关于JupyterLab的更多信息

JupyterLab还有许多实用的功能。要了解这些功能,可以阅读Jupyter团队对JupyterLab的介绍,链接为https://jupyterlab.readthedocs.io/en/stable/index.html。

单击GETTING STARTED下的Overview可以看到概述。此外,如需了解更多其他的功能,可以阅读USER GUIDE,其中有对JupyterLab界面、文件操作、文本编辑器和Notebook的介绍。


[1] 在阅读本节之前,请按照“开始阅读本书之前”部分中的说明安装包含IPython解释器的Anaconda Python发行版。

[2] Jupyter可以通过安装相关语言的“内核”支持许多编程语言。更多相关信息可以参考https://github.com/jupyter/jupyter/wiki/jupyter-kernels。

[3] 在下一章中,我们会看到在某些情况下不显示out[]