当前位置:   article > 正文

IPython 教程,IPython技巧,开始使用IPython

ipython教程

在本章中,我们首先进行一遍IPython的安装过程,再大概浏览一下IPython提供的功能。IPython提供了一个高度优化的Python控制台和Notebook。除此之外,当与第三方包,如NumPyMatplotlib,结合使用进行交互式计算时它是不可或缺的工具。这些包给Python提供了高性能计算和交互式可视化的特性。在本章的结尾,你将安装好IPython及其相关的依赖包在电脑上。你也将了解了IPython主要功能,这些功能将会在后续的章节详细介绍。

这些细节包括:

  • ①运行IPython控制台
  • ②使用IPython作为系统shell
  • ③使用历史(history)
  • ④Tab补全
  • ⑤使用%run命令运行脚本
  • ⑥使用%timeit命令快速测量时间
  • ⑦使用%pdb命令快速debug
  • ⑧使用Pylab进行交互式计算
  • ⑨使用IPython Notebook
  • ⑩定制IPython

安装IPython及推荐的包

不要问为什么,我们使用Python2.7版本,直接安装Anaconda集成包,我们所需要的东西里面都有,且各种依赖的版本相协调,自己逐个安装的话将会很麻烦,尤其是遇到版本不匹配的时候。

这些包主要是 :

  • NumPy 高性能多维数组矢量计算
  • SciPy 高级i数值计算算法
  • Matplotlib 绘图及交互式可视化
  • Matplotlib-basemap Matplotlib绘图工具箱
  • Network X 处理图问题
  • Pandas 处理任意的表数据
  • Python Image Library(PIL),图片处理算法
  • PySide Qt的Python封包,用于图形用户接口(GUI)
  • PyQt 和PySide类似,但使用不同的用户协议
  • Cython 在Python中使用C语言代码

【自己逐个安装的话注意一下版本号】

使用Python的包系统

主要是下面两个,学过Python应该会对其比较熟悉。不了解的可以复制为关键字通过搜索引擎寻找答案

  • ①easy_install
  • ②pip

可选的IPython依赖

  • ①pyreadline 提供行编辑功能
  • ②pyzmq IPython并行计算依赖,如Qt控制台,Notebook
  • ③pygments Qt控制台语法高亮
  • ④tornado 基于web的Botebook的依赖

注意:在你安装二进制IPython的时候它们将自动安装,而从源码安装却不会。

IPython的十大基础

运行IPython控制台

如果IPython已经被正确安装,你就应该能够从系统shell中使用ipython命令启动它。你可以使用这个代理替代Python解释器,如下面截图这样

当然,IPython能提供的不止这个。IPython提供了数十个小命令可以用来提高工作效率。我们可以在本书中见到很多。

这些命令中有些用来帮助你获得任意的Python函数和对象的心意。比如,你是否遇到过对怎样在派生类中使用super函数访问父类的方法?只需敲下super%pinfo super 的快捷方式) 你就会找到与super函数相关的所有信息。appending?或??等等,所有的命令或变量你都能获得他们的信息。使用示例如下:

Python
In [1]: super? Typical use to call a cooperative superclass method: class C(B): def meth(self, arg): super(C, self).meth(arg)
1
2
3
4
5
6
In [ 1 ] : super ?
Typical use to call a cooperative superclass method :
class C ( B ) :
def meth ( self , arg ) :
super ( C , self ) . meth ( arg )
 

使用 IPython作为系统shell

你可以使用IPython的命令行接口作为一个扩展的系统shell。你可以使用它访问你的文件系统和执行任何系统命令。比如,标准的Unix命令pwd、ls和cd在IPython中都是可用的,在windows平台下也能使用。就像下面这样:

Python
In [<span class="hljs-number">1</span>]: pwd Out[<span class="hljs-number">1</span>]: <span class="hljs-string">u'C:\\'</span> In [<span class="hljs-number">2</span>]: cd windows C:\windows
1
2
3
4
5
In [ < span class = "hljs-number" > 1 < / span > ] : pwd
Out [ < span class = "hljs-number" > 1 < / span > ] : < span class = "hljs-string" > u 'C:\\' < / span >
In [ < span class = "hljs-number" > 2 < / span > ] : cd windows
C : \ windows
 

这些命令尤其是“魔法命令”是IPython的核心。在本书中我们将会使用数十个魔法命令。你可以通过魔法命令%lsmagic获得所有魔法命令的列表。

【魔法命令实际上带有一个%prefix,但是自动魔法系统缺省状态下是开启的,你可以直接忽略掉它。这个prefix是随时可用的,尤其是当一个unprefixed命令被一个同名的Python变量所掩盖的时候。%automagic命令可以开启自动魔法系统。在本书中,我们一般使用%prefix去引用魔法命令。但是请记住,如果你喜欢,完全可以忽略不用它】

使用history

就像标准的控制台一样,IPython提供历史命令的功能。然而,不同于Python控制台,IPython的命令历史扩展了对历史命令的交互会话。除此之外,很多关键字缩写可以大大减少重复的输入。

在IPython控制台代理中,使用上下键浏览所有的历史输入。如果在按下箭头键之前开始输入,只有你匹配显示你曾经输入的命令。

在任何交互会话中,你的所有输入和输出历史将会被保存在In和Out变量中,并被编号进行索引。_,__,____i,__i,___i变量保存着 最后三个输出和输入对象。_n_in变量返回第n个输出和输入历史命令。比如,让我们尝试一下

Python
In [<span class="hljs-number">4</span>]: a = <span class="hljs-number">12</span> In [<span class="hljs-number">5</span>]: a ** <span class="hljs-number">2</span> Out[<span class="hljs-number">5</span>]: <span class="hljs-number">144</span> In [<span class="hljs-number">6</span>]: print(<span class="hljs-string">"The result is {0:d}."</span>.format(_)) The result <span class="hljs-keyword">is</span> <span class="hljs-number">144.</span>
1
2
3
4
5
6
In [ < span class = "hljs-number" > 4 < / span > ] : a = < span class = "hljs-number" > 12 < / span >
In [ < span class = "hljs-number" > 5 < / span > ] : a * * < span class = "hljs-number" > 2 < / span >
Out [ < span class = "hljs-number" > 5 < / span > ] : < span class = "hljs-number" > 144 < / span >
In [ < span class = "hljs-number" > 6 < / span > ] : print ( < span class = "hljs-string" > "The result is {0:d}." < / span > . format ( _ ) )
The result < span class = "hljs-keyword" > is < / span > < span class = "hljs-number" > 144. < / span >
 

在这个示例中,我们在第六行显示了输出,就是第五行的输出

Tab补全

Tab补全是非常有用的一个功能,你将会发现你会经常使用它。无论何时你开始如入任何命令、变量名或函数,敲击Tab键让IPython自动帮你补全你想要输入的内容或显示一个可能匹配的命令或变量名列表。对于文件目录也是有效的,就像系统shell一样。

你也可以使用它进行动态对象提示。输入任何Python对象之后紧跟这输入一个点,按下Tab键,IPython将会显示一个存在的属性和方法列表,就像下面这样:

Python
n [<span class="hljs-number">1</span>]: <span class="hljs-keyword">import</span> os In [<span class="hljs-number">2</span>]: os.path.split<TAB> os.path.split os.path.splitdrive os.path.splitext os.path.splitunc
1
2
3
4
n [ < span class = "hljs-number" > 1 < / span > ] : < span class = "hljs-keyword" > import < / span > os
In [ < span class = "hljs-number" > 2 < / span > ] : os.path . split < TAB >
os.path . split os.path . splitdrive os.path . splitext os.path . splitunc
 

在第二行,就像先前的代码一样,在os.path.split之后敲击Tab键,IPython接着就会显示可能的命令。

【Tab补全和私有变量:Tab补全只会显示除以下划线开头之外的对象属性和方法。原因是在Python中以下划线开头的属性和方法是私有的。若要强制IPython显示所有的私有属性和方法,在敲击Tab键之前输入myobject._。在Python中没有真正的私有和隐藏。这是Python哲学的一部分,就像一据挺有名的话所表达的那样“大家都是成年人了”】

使用%run命令运行脚本

尽管很重要,交互式控制台在运行多命令序列时受到很大限制。编写多条命令脚本,以.py后缀保存文件,这样的Python脚本可以在IPython中以 %run+文件名的形式进行运行。除非-i选项被使用,脚本将运行在一个全新的命名空间。但脚本中定义的所有变量在脚本执行结束后都成为可用的。

让我们编写下面的Python脚本并以script.py保存:

Python
print(<span class="hljs-string">"Running script."</span>) x = <span class="hljs-number">12</span> print(<span class="hljs-string">"'x' is now equal to {0:d}."</span>.format(x))
1
2
3
4
print ( < span class = "hljs-string" > "Running script." < / span > )
x = < span class = "hljs-number" > 12 < / span >
print ( < span class = "hljs-string" > "'x' is now equal to {0:d}." < / span > . format ( x ) )
 

假设我们现在在文件所在的目录,我们可以在IPython中像下面这样运行它:

Python
In [<span class="hljs-number">1</span>]: %run script.py Running script. <span class="hljs-string">'x'</span> <span class="hljs-keyword">is</span> now equal to <span class="hljs-number">12.</span> In [<span class="hljs-number">2</span>]: x Out[<span class="hljs-number">2</span>]: <span class="hljs-number">12</span>
1
2
3
4
5
6
In [ < span class = "hljs-number" > 1 < / span > ] : % run script . py
Running script .
< span class = "hljs-string" > 'x' < / span > < span class = "hljs-keyword" > is < / span > now equal to < span class = "hljs-number" > 12. < / span >
In [ < span class = "hljs-number" > 2 < / span > ] : x
Out [ < span class = "hljs-number" > 2 < / span > ] : < span class = "hljs-number" > 12 < / span >
 

使用%timeit命令快速测量代码运行时间

在一个交互会话中你可以使用%timeit魔法命令快速测量代码运行时间。这可以让你评估单挑命令的运行时长。相同的命令会在一个循环中多次执行,多次运行时长的平均值作为该命令的最终评估时长。-n选项控制命令在单次循环中执行的次数,-r选项控制执行循环的次数。例如

Python
In[<span class="hljs-number">1</span>]: %timeit [x*x <span class="hljs-keyword">for</span> x <span class="hljs-keyword">in</span> range(<span class="hljs-number">100000</span>)] <span class="hljs-number">10</span> loops, best of <span class="hljs-number">3</span>: <span class="hljs-number">26.1</span> ms per loop
1
2
3
In [ < span class = "hljs-number" > 1 < / span > ] : % timeit [ x * x < span class = "hljs-keyword" > for < / span > x < span class = "hljs-keyword" > in < / span > range ( < span class = "hljs-number" > 100000 < / span > ) ]
< span class = "hljs-number" > 10 < / span > loops , best of < span class = "hljs-number" > 3 < / span > : < span class = "hljs-number" > 26.1 < / span > ms per loop
 

看,当x达到100000的时候花费了26毫秒。

使用%debug命令进行快速debug

IPython带有一个强大的调试器。无论何时控制台抛出了一个异常,你都可以使用%debug魔法命令在异常点启动调试器。接着你就能调试模式下访问所有的本地变量和整个栈回溯。使u和d向上向下访问栈,使用q推出调试器。在调试器中输入?可以查看所有的可用命令列表。

你也可以使用%pdb魔法命令去激活IPython调试器,这样,每当异常抛出时,调试器就会自动运行。

使用Pylab进行交互式计算

%pylab魔法命令可以使Numpymatplotlib中的科学及算功能生效,这些功能被称为基于向量和矩阵的高效操作,交互式可视化特性。这使得在控制台进行交互式计算和动态绘图称为可能。如:

Python
In [<span class="hljs-number">1</span>]: %pylab Welcome to pylab, a matplotlib-based Python environment [backend: TkAgg]. For more information, type <span class="hljs-string">'help(pylab)'</span>. In [<span class="hljs-number">2</span>]: x = linspace(-<span class="hljs-number">10.</span>, <span class="hljs-number">10.</span>, <span class="hljs-number">1000</span>) In [<span class="hljs-number">3</span>]: plot(x, sin(x))
1
2
3
4
5
6
In [ < span class = "hljs-number" > 1 < / span > ] : % pylab
Welcome to pylab , a matplotlib - based Python environment [ backend : TkAgg ] .
For more information , type < span class = "hljs-string" > 'help(pylab)' < / span > .
In [ < span class = "hljs-number" > 2 < / span > ] : x = linspace ( - < span class = "hljs-number" > 10. < / span > , < span class = "hljs-number" > 10. < / span > , < span class = "hljs-number" > 1000 < / span > )
In [ < span class = "hljs-number" > 3 < / span > ] : plot ( x , sin ( x ) )
 

在这个示例中,我们首先定义了一个-10到10线性空间1000个数值的向量。接着我们绘制(x,sin(x))。像下面的截图一样,一个带有绘制图线的窗口就会出现。而且在窗口被打开时,控制台不会被阻塞。这就允许我们可以在窗口打开的状态下动态的修改绘制的图线。

使用IPython Notebook

Notebook将IPython的功能带到了浏览器中,可以多行编辑、交互会话再现等等。它是一种在交互式使用Python的现代的、强大的方式。

要使用Notebook,只需在shell中输入ipython notebook这个命令(需确认你已经正确安装了在安装章节提到的各种依赖)。接着就会在默认的8888断开开启一个本地的web服务。在浏览器中打开http://127.0.0.1:8888/创建一个新的Notebook

你可以在输入框内编写多行代码。这里是一些常用的快捷键:

  • ①Enter 在输入框内创建新的一行且不执行这个输入框中的代码;
  • ②Shift+Enter 执行这个框内的代码并转到下一个框内;
  • ③Alt+Enter 执行框内代码,并在之后追加一个空的输入框
  • ④Ctrl+Enter 当你不想保存输出时,进行快速的实例实验;
  • ⑤Ctrl+M 接着K 显示所有的键盘快捷键。

我们将会在后续的章节详细介绍Notebook的特性功能。

定制IPython

你可以用一个Python文件保存你的用户配置;这个文件被称作IPython配置文件。在shell中输入ipython profile create 来创建默认的配置文件。这将会在.~/.ipython或~/.config/ipython目录下创建一个明文profile_config.py的文件夹。你可以使用ipython profile create profilename以不同的名字创建配置文件,接着以ipython --profile=profilename使用配置文件启动IPython。

~目录是你的家目录,例如,在Unix中/home/yourname,或者windows中c:\users\yourname、c:\documents and settings\yourname。

总结

在这一章中,我们已经学习了IPthon及其扩展Python包的多种安装方式。最直接的方式是安装一个包含所有包的独立Python发行版如Enthought Python Distribution or CanopyAnacondaPython(x,y), 或ActivePython。另外的一种方式是逐步以二进制形式或Python的包系统形式安装不同的包。

我们还大概浏览了IPyton提供的十大有趣特性功能。他们对于Python的交互式操作有很大联系,包括集成调试器和配置文件、Numpymatplotlib提供的交互式计算和可视化。在后续的章节中,我们将会详细学习交互式shell、Python控制台以及Notebook。




  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/826533
推荐阅读
相关标签
  

闽ICP备14008679号