为什么要使用IPython

IPython提供了改进的交互式Python Shell,我们可以利用IPython来执行Python语句,并能够立刻看到结果,这一点跟Python自带的shell工具没有什么不同,但是IPython额外提供了很多实用的功能是Python自带的shell所没有的,下面就来看看这些实用的功能吧。

####Tab自动补全 使用过Linux命令行的同学都知道tab自动补全有多实用吧,IPython可以针对之前输入过的变量,对象的方法等进行自动补全。我们只需要输入一部分,就可以看到命名空间中所有相匹配的变量,函数等

1.JPG

这个示例显示了,当输入mylist. 之后按tab键就自动出现的可以使用的method。 tab补全还可以针对文件路径进行补全,例如下面的例子在输入Anaconda之后按tab自动显示路径下的所有可选路径

2.JPG

####内省 在变量的前面或者后面加问号?就可以查询改对象相关的信息(简要信息),有的时候对象的描述信息较多时,需要两个问号??来显示全部信息.

3.JPG

####魔术命令 魔术命令(magic commands)是IPython提供一整套命令,用这些命令可以操作IPython本身,以及提供一些系统功能。魔术命令分为两种:一种是基于行的(line-oriented), 命令只针对一行;另一种是基于单元的(cell-oriented), 命令可以针对多行,均作为其参数。 比如:下面这个%timeit魔术命令就是line-oriented %timeit range(1000) 下面的魔术命令是cell-oriented %%timeit x = numpy.random.rann((100, 100)) numpy.linalg.svd(x) 注:这里timeit只针对svd进行测试,不会针对x变量的赋值做测试。

IPython提供了很多类似的魔术命令,如果你想看都有哪些魔术命令,可以通过%lsmagic来查询,如果想查询某个命令的详细信息,可以通过%cmd?来获取,例如:%run? 另外,默认情况下automagic是ON状态,也就是说对于line-oriented命令我们不需要使用前面的百分号%,直接输入命令即可(例如:timeit range(1000) ),但是对于cell-oriented命令我们必须输入%%,可以通过%automagic来打开/关闭这个automagic功能。

下面仅就常用的魔术命令做下介绍:

%run 命令

该命令可以直接执行python脚本,并输出结果,比如我们有一个python文件如下:

1
2
3
4
5
6
# test.py
def main():
print "this is a test."

if __name__ == '__main__':
main()

在IPython中执行如下图:

run.JPG

%paste 和 %cpaste命令

我们经常会将python文件中的代码粘贴到IPython中执行,以便查看效果,尤其是针对现实图形的代码。这时如果直接拷贝粘贴,IPython可能无法正确的执行,这是因为IPython一旦遇到空行就认为粘贴结束,然后就开始执行了。 例如,我们有如下代码:

1
2
3
4
5
def add(x, y):
result = x + y
print result

add(1, 2)

如果直接拷贝粘贴到IPython当中,就会报错,如下:

paste.JPG

这时我们就需要使用%paste或者%cpaste来粘贴了,先拷贝代码,然后在IPython中输入%paste,结果如下:

paste_cmd.JPG

%cpaste也可以粘贴代码,与%paste区别就是它可以持续粘贴(即continue paste),直到我们按Ctrl+D或者输入双减号"--"以结束粘贴

%pdb

用以打开/关闭自动pdb唤出功能,当我们打开这个功能的时候(通过%pdb on 或者%pdb 1),程序一旦遇到exception就会自动调用pdb,进入pdb交互界面(如果要关闭该功能可以通过%pdb off 或者%pdb 0) 例如我们有一个test2.py文件如下:

1
2
3
4
5
6
7
8
def raise_exception():
var_before_exception = 1
raise Exception("test")
var_after_exception = 2
print var_before_exception
print var_after_exception

raise_exception()

当我们打开pdb开关后,执行如下图所示:

pdb.JPG

可以发现pdb在raise exception的地方被唤出了。

%edit

用于启动一个编辑器。在Linux上会启动vim,在Windows上会启动notepad。我们可以在编辑器上编辑代码,保存退出后就会执行相应代码。

!cmd

!后可以跟一个shell指令,从而在IPython界面就可以直接执行shell指令而不需要再退出IPython了 例如下面执行一条ping命令:

ping.JPG

除上述魔术命令外,IPython还提供了很多其它命令,下表列出了常用的一些命令,如果要查看完整列表,请使用%lsmagic

命令 命令说明
%hist 查询输入的历史
%reset 清空namespace
%prun 使用Python profiler运行python代码。注:profiler是用于测试代码性能的工具
%time 用于显示Python语句的执行时间,包括cpu time和wall clock time
%timeit 用于显示Python语句的执行时间,但是这个命令会多次执行相应的语句(可以指定次数)%timeit只针对一行Python语句,如果有多条语句,需要用分号分隔开,同时%%timeit是cell-oriented魔术命令,紧跟在命令后面的语句是作为setup code的,在cell body中的代码才会被timeit多次执行并计算时间
%bookmark 用于存储常用路径
%cd 进入目录命令
%env 显示系统环境变量
%pushd dir 将当前目录入栈,并进入dir指定的目录
%popd 弹出栈顶目录

matplotlib集成和pylab模式

IPython在使用matplotlib库生成图形的时候,仍然可以在IPython交互界面输入和操作,这是它比Python shell强大的一个重要功能点,使得我们在做科学计算的时候,可以更好的与数据交互并可视化。而要使用此功能,需要在启动IPython的时候,开启pylab模式,如下 $ipython --pylab

输入和输出

IPython的交互界面提示符分为In和Out,In代表输入并在后面的中括号中带有行号,如: In [2]: Out代表输出,同样也有行号。IPython提供了一下几种快捷方式方便我们操作输入和输出: ● _ 和__: 单下划线_代表上一个输出,双下划线代表上上个输出 ● _iX和_X: X代表行号,_iX代表第X行的输入的字符串,_X代表输出的字符串 ● exec:我们可以利用exec命令来执行历史的输入操作 下图展示了如何利用这些快捷方式更方便的进行输入和输出的操作:

inout.JPG

键盘快捷键

IPython提供了类似Linux的快捷键操作方式,可以方便我们的命令操作

快捷键 说明
Ctrl + A 光标移到行首
Ctrl + E 光标移到行尾
Ctrl + K 删除从光标开始到行尾的字符
Ctrl + U 删除从光标开始到行首的字符
Ctrl + R 搜索匹配的历史命令
Ctrl + P或上箭头 搜索之前的历史命令
Ctrl + N或下箭头 搜索之后的历史命令
Ctrl + L 清屏

总而言之,IPython为我们提供了很多强大的功能,本篇文章只是简要概述了下IPython的强大之处,还有很多有待大家自己去探索,尤其值得一提的是IPython还提供了notebook功能,也非常强大,由于篇幅所限,大家可以自己在网上搜索相关文章来参考。