JUPYTER NOTEBOOK/Lab
Jupyter Notebook 是一种交互式编程环境,或称探索式编程环境。它由网页和服务器组成。
网页由一个个单元格组成,在单元格里编写代码,或者描述性文字。当我们执行代码单元格时,单元格的代码会被发送到后台服务器运行,输出结果再传送回浏览器,显示在对应的代码单元格下方。
这种方式特别适合于数据科学家。作为从事数据分析的人,他们往往需要先加载一部分数据,绘图看看数据分布特性,再运行一个模型,得到结果并可视化,再决定下一步怎么做。
这种风格就被称为探索式编程。它区别于工程化编程的地方是,工程化编程的方向和目标都十分明确,基本上不存在推倒重来的情况。而在探索式编程中,一个模型不能用,推倒重来是很正常的事,并不意味着失败。
我们的环境是基于 Jupyter Lab 构建的。它前身是 jupyter notebook server,不过现在官方已决定弃用 notebook 了。注意,notebook 即可能指代 notebook server,也可能指代一个个具体的,后缀为.ipynb 的文件。当它指代 notebook server 时,它是被官方弃用的;但 jupyter lab 使用的文件格式仍然是 notebook,即后缀为.ipynb 的这些文件。
我们使用 Jupyter lab 来作为实验环境,是因为一方面我们需要给示例代码配上大量的说明性文字,方便大家理解;其次,我们对策略的探索也非常符合探索式编程的模型。
1. Notebook 语法
Notebook 由一个个单元格组成。一共有三种格式的单元格,Markdown, Python 和 Raw 格式的单元格。您正在读到的这段文字,就处在一个 Markdown 单元格下。在 Markdown 单元格中,我们可以按照 Markdown 语法来对文字进行简单的格式化。比如,这个单元格的标题,是由两个“#”引起的,在 Markdown 语法中,这意味着二级标题。
在我们的系统里,我们还安装了 myst 扩展,以更加生动、灵活地传递信息。您正在读到的这段话,它的渲染格式被称之为 admonition,就是通过 myst 来渲染的。
在课程中,我们还使用 myst 来实现精美的图文混排。少数地方也可能直接使用 html 语法片段。
如果您在我们课程中,觉得某些排版效果很好,可以双击该单元格,了解它的语法。
Python 单元格是我们书写代码的地方。Notebook 的一大优势是可以分段执行,即在一个 notebook 中,如果存在多个 Python 单元格,这些单元格都是可以分别运行(即使它们之间存在逻辑上的依赖,必须顺序运行,也仍然是分别运行,即我们可以一次只运行一个单元格并查看输出结果)。这种方式,给我们学习和探索带来很大的方便。
Raw 格式的单元格一般我们不会用到,这里就不介绍了。
2. Notebook 界面
在页面上方我们会看到这样一个工具条。
序号 1 指向的是存盘按钮。点击后,我们对 notebook 作的修改就会保存。
在本课程中,我们提供的 notebook 是只读的,因此您看到的这个按钮将是灰色的,也就是无法保存。课程学员一般可以在自己的工作区新建 notebook 并保存。如果您只有预览权限,也可以修改、运行这些 notebook,但无法保存。
当我们选中一个代码单元格时,就可以点击序号 2 指示的按钮以运行它。当单元格正在运行时,它左侧的状态将显示为 [*],同时序号 4 所指标的 notebook 状态将显示为忙。
<img src="https://roim-picx-bpc.pages.dev/rest/ROS4e7K.jpeg" width="200px" align="left" style="margin:10px">
如果当前没有单元格正在执行,则会显示为左图所示的状态。
如果一个单元格执行时间过长,我们也可以点击序号 3 指向的按钮,以中断执行。
<img src="https://roim-picx-bpc.pages.dev/rest/NN0Fe7K.jpeg" width="200px" align="left" style="margin:10px">
序号 4 显示了当前 notebook 中的状态。左图的状态表明当前没有连接到后台服务器。您需要选择一个 kernle 并连接。
3. 代码提示
import numpy as np
np.random.
在上述单元格中,将光标移动到. 之后,再按一次 tab 键,这将给您一些代码提示:
<div style="width:100%;text-align:center">
<img src="https://roim-picx-bpc.pages.dev/rest/uI8Fe7K.jpeg" width="350px" align="center">
</div>
4. 文档帮助
<div style="width:100%;text-align:center">
<img src="https://roim-picx-bpc.pages.dev/rest/qj8Fe7K.jpeg" style="width:300px">
</div>
有两种方式可以得到文档帮助。一种是在我们要查询的函数之后,输入'?'并运行。另一种方式类似于代码提示,不过要按两次 tab(有可能要加入 shift 键,请查询 notebook 快捷键帮助)。最终我们将得到左图所示的文档。
5. 重启 notebook
有时候您可能需要重启 notebook。通过菜单栏 Kernel,再选择需要的操作:
<div style="width:100%;text-align:center">
<img src="https://roim-picx-bpc.pages.dev/rest/STjFe7K.jpeg" style="width:300px">
</div>
6. 导航和跳转
有时候我们会遇到这样的情况,在底部的某个单元格工作时,要跳到头部的某个单元格进行修改并运行,然后再回到底部单元格继续工作。这在 IDE 中非常简单,往往会有快捷键帮助我们跳转。但 Jupyter Notebook 基于浏览器工作,就无法提供这样的功能了。
有一个补救方案。如果文档很长,您应该在其中插入 markdown 单元格进行注释和说明,并且使用多级标题。这样,我们就可以利用它的导航功能来进行跳转:
我们可以点击左侧面板中的任意一个标题,快速跳转到对应的节中。