在 IPython 的官网(ipython.org)上,介绍其的第一句话即是:IPython 是一个增强版的交互式 Shell。另外不少介绍 IPython 的文章也常以这句话开头,但这句话实在是等于没说。让 IPython 在各类 shell(IDE) 中脱颖而出,成为科学计算标配的,并非按 Tab 键代码补完、以 % 开头的魔术命令这些你们都有的东西,而是与 matplotlib 这个数据可视化(绘图)包的深度集成以及奇妙的 Notebook。python
IPython 较早的富 GUI 实现应该是 Qt Console。过去在标准 shell 里绘图时,弹出的绘图窗口会接管 shell 会话的控制权,你想继续输入命令就必须先把绘图窗口关掉。这对于但愿同时实现可视化和交互式过程的数据分析用户来讲显然是难以忍受的,所以 Qt console 站出来解决了这个问题。在 Qt console 中经过 matplotlib 绘制的图形会独立嵌于控制台中,并不影响你继续输入命令。git
2011年,由 Brian Granger 领导的 IPython 团队开始开发一种基于Web技术的交互式计算文档格式,即 IPython Notebook。为何说它是文档格式,而非计算工具呢?实际上它二者都是。Notebook 在交互上使用了 C/S 结构,它经过 Tornado 创建一个 shell 服务器,并使用浏览器做为客户端。另外 notebook 页面都被保存为 .ipynb
的类 JSON 文件格式。这种文件格式也是 Notebook 最吸引人的地方。github
###Tab 键自动完成 和其余 IDE 差很少,本身多试试就行了 <br /> ###内省 在变量名或命令的前面或后面加一个 “?” 并执行,能够用于显示该对象的一些通用信息,如对象类型、文档字符串等,这就叫作对象内省。这种操做查看到的信息,尤为是函数和类的信息,比一般直接引用变量名而后回车所看到的(__repr__
)要好。“?” 的另外一个用法是能够搜索 IPython 的命名空间,配合通配符使用效果以下:shell
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 的支持!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 的操做方式了解的差很少。