在 IPython 的官网(ipython.org)上,介绍其的第一句话便是:IPython 是一个加强版的交互式 Shell。另外很多介绍 IPython 的文章也常以这句话开头,但这句话实在是等于没说。让 IPython 在各种 shell(IDE) 中脱颖而出,成为科学计算标配的,并不是按 Tab 键代码补完、以 % 开头的魔术命令这些大家都有的东西,而是与 matplotlib 这个数据可视化(绘图)包的深度集成以及奇妙的 Notebook。
IPython 较早的富 GUI 实现应该是 Qt Console。过去在标准 shell 里绘图时,弹出的绘图窗口会接管 shell 会话的控制权,你想继续输入命令就必须先把绘图窗口关掉。这对于希望同时实现可视化和交互式过程的数据分析用户来说显然是难以忍受的,因此 Qt console 站出来解决了这个问题。在 Qt console 中通过 matplotlib 绘制的图形会独立嵌于控制台中,并不影响你继续输入命令。
2011年,由 Brian Granger 领导的 IPython 团队开始开发一种基于Web技术的交互式计算文档格式,即 IPython Notebook。为什么说它是文档格式,而非计算工具呢?实际上它两者都是。Notebook 在交互上使用了 C/S 结构,它通过 Tornado 建立一个 shell 服务器,并使用浏览器作为客户端。另外 notebook 页面都被保存为 .ipynb
的类 JSON 文件格式。这种文件格式也是 Notebook 最吸引人的地方。
IPython Notebook 更详细的介绍在下面第二节中给出,第一节讲的是一些对 IPython 的各种实现通用的功能。 <br /> #基础
###Tab 键自动完成 和其他 IDE 差不多,自己多试试就好了 <br /> ###内省 在变量名或命令的前面或后面加一个 “?” 并执行,可以用于显示该对象的一些通用信息,如对象类型、文档字符串等,这就叫做对象内省。这种操作查看到的信息,尤其是函数和类的信息,比通常直接引用变量名然后回车所看到的(__repr__
)要好。“?” 的另一个用法是可以搜索 IPython 的命名空间,配合通配符使用效果如下:
lang:python
In [1]:import numpy as np
In [2]:np.*load*?
np.load
np.loads
np.loadtxt
np.pkgload
使用双问号“??”还可以查看对象的源代码(如果可见的话)。 <br /> ###魔术命令 在 IPython 的会话环境中,所有文件都可以通过 %run
命令来当做脚本执行,并且文件中的变量也会随即导入当前命名空间。即,对于一个模块文件,你对他使用 %run
命令的效果和 from module import *
相同,除非这个模块文件定义了 main 函数(if __name__ == '__main__:'
),这种情况下 main 函数还会被执行。
这种以 % 开头的命令在 IPython 中被称为魔术命令,用于加强 shell 的功能。常用的魔术命令有: <br />
<table> <tr> <td>%quickref</td> <td>显示 IPython 快速参考</td> </tr> <tr> <td>%magic</td> <td>显示所有魔术命令的详细文档</td> </tr> <tr> <td>%debug</td> <td>从最新的异常跟踪的底部进入交互式调试器</td> </tr> <tr> <td>%pdb</td> <td>在异常发生后自动进入调试器</td> </tr> <tr> <td>%reset</td> <td>删除 interactive 命名空间中的全部变量</td> </tr> <tr> <td>%run <i>script.py</i></td> <td>执行 <i>script.py</i></td> </tr> <tr> <td>%prun <i>statement</i></td> <td>通过 cProfile 执行对 <i>statement</i> 的逐行性能分析</td> </tr> <tr> <td>%time <i>statement</i></td> <td>测试 <i>statement</i> 的执行时间</td> </tr> <tr> <td>%timeit <i>statement</i></td> <td>多次测试 <i>statement</i> 的执行时间并计算平均值</td> </tr> <tr> <td>%who、%who_ls、%whos</td> <td>显示 interactive 命名空间中定义的变量,信息级别/冗余度可变</td> </tr> <tr> <td>%xdel <i>variable</i></td> <td>删除 <i>variable</i>,并尝试清除其在 IPython 中的对象上的一切引用</td> </tr> <tr> <td>!<i>cmd</i></td> <td>在系统 shell 执行 <i>cmd</i></td> </tr> <tr> <td>output=!<i>cmd args</i></td> <td>执行<i>cmd</i> 并赋值</td> </tr> <tr> <td>%bookmark</td> <td>使用 IPython 的目录书签系统</td> </tr> <tr> <td>%cd <i>direcrory</i></td> <td>切换工作目录</td> </tr> <tr> <td>%pwd</td> <td>返回当前工作目录(字符串形式)</td> </tr> <tr> <td>%env</td> <td>返回当前系统变量(以字典形式)</td> </tr> </table> <br /> 对魔术命令不熟悉的话可以通过 `%magic` 查看详细文档;对某一个命令不熟悉的话,可以通过 `%cmd?` 内省机制查看特定文档。值得一提的是,IPython 中使用 `del` 命令无法删除所有的变量引用,因此垃圾回收机制也无法启用,所以有些时候你会需要使用 `%xdel` 或者 `%reset`。 <br /> ###历史输入和输出变量 与标准 Shell 类似,IPython 中也可以通过 `_` 和 `__` 访问上一次和上上一次的输出。同时你肯定注意到了,IPython 中每一次的输入输出都有序号。访问历史 X 行输出的方法为:`_X`;访问历史 X 行输入的方法为:`_iX`。因为访问历史输出的使用概率较历史输入大很多,所以访问历史输出仅使用下划线加行号即可,同时为了区分,访问历史输入时需添加小写字母 “i”,代表 “in”。
lang:Python
In [24]:1+1
Out[24]:2
In [25]:_i24
Out[25]:'1+1'
In [26]:_24
Out[26]:2
<br /> #Notebook --- Notebook 的官方信息可以从 ipython.org/notebook 获得,不过好像被墙了。上不去的话也可以访问它的 github 页面,ipython/examples/Notebook 目录下有很多可供参考的内容。前面说过 Notebook 有一种 .ipynb 的文件格式,当你打开这个例程目录下的某个文件后,就能体会到 Notebook 的奇妙之处了。 <br /> ###演示文档 目前在各种 Python 研讨会上,一种流行的演示手段就是使用 IPython Notebook,然后再将 .ipynb 文件发布到网上以供所有人查阅。除了前面说过的可以内嵌 matplotlib 绘图外,Notebook 还同时提供了对 LaTex 和 MarkDown 的支持!
如上图便展示了一个 .ipynb 文件的示例页面。其中一对 In Out
会话被视作一个单元,称为 cell
。第一个 cell 里我写入的内容其实是:
##LaTex 演示
---
$Z=\frac{X-\bar{X}}{S}$
分别使用了 MarkDown 和 LaTex 的语法。按下 Shift + Enter
后这段内容就被渲染成了图片中的样子。
cell 特别亲切的地方在于:它可以作为一个类似“段落”的概念来进行编辑,不管是执行前还是执行后,而且既可以针对内容进行编辑,也可以对 cell 整体应用 copy、paste、cut 等操作,甚至还可以前后移动 cell 的位置。这带来的好处是,在大量试验性的交互操作过后,他不会像普通 shell 那样留下无数没用的 IO 内容。如果某条命令的输出不理想或者报了错,你就可以回头编辑后重新运行,或把它移位或干脆删掉。这样在很久的一段交互过程后,Notebook 留下的反而是一份干净整洁的文档。
.ipynb 文件使用的是一种类 JSON 的文本格式,就像这样:
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##LaTex \u6f14\u793a\n",
"---\n",
"$Z=\\frac{X-\\bar{X}}{S}$"
]
},
这种交互式计算环境,对绘图、数学公式、简易排版语法的支持,还有一种方便的文档格式,共同帮助 Notebook 成为了 Python 科学计算的理想工具。另外这种使用浏览器和服务进程的 C/S 结构还暗含了一种远程连接可能,抛开安全性不谈的话,其在教学方面也有很高的潜力。 <br /> ###操作指南 当通过 IPython Notebook.exe 进入应用时,首先打开的是 Home 页面,地址一般为:http://127.0.0.1:8888/tree
。Home 目录下会列出所有的历史文件记录,右上角则有一个 “New Notebook” 按钮可以新建一个会话。
在 .ipynb 文件的交互页面,需要注意的除了标准的 IPython 语法外,就是页面抬头处的菜单栏和工具栏了。Notebook 很贴心地提供了非常友好的帮助页面,因此本文不再赘述。基本看完这两个页面(内容很少)后就能对 Notebook 的操作方式了解的差不多。