附录 F IPython 指南

尽管你的 Python shell 是有用的,但它缺少了 IPython(http://ipython.org/)的很多魔力。 IPython 是一个增强的 Python shell,提供了一些易于使用的快捷方式和在 shell 环境中同 Python 交互的额外能力。它最初由想要一个更简单的 Python shell 的科学家和学生开发(http://blog.fperez.org/2012/01/ipython-notebook-historical.html)。后来,它变成了学习 Python 以及通过解释器与 Python 交互的事实上的标准。

F.1 为什么使用IPython

IPython 提供了很多在标准 Python shell 中缺少的功能。安装和使用 IPython 作为你的 shell 有很多好处。它的特性包括:

  • 易于阅读的文档钩子

  • 自动补全和用于库、类和对象探索的魔法命令

  • 内联图片和图表生成

  • 用来浏览历史、创建文件、调试脚本、重新加载脚本等的辅助工具

  • 内置的命令行工具帮助

  • 启动时的自动导入

它也是 Jupyter(https://jupyter.org/)的一个重要组成部分。Jupyter 是一个共享的 notebook 服务器,可以快速方便地在浏览器中进行数据探索。我们在第 10 章中介绍了使用 Jupyter 进行代码分享和演示。

F.2 IPython起步

IPython 可以用 pip 方便地安装:

  1. pip install ipython

如果你正在使用多个虚拟环境,可能想要安装全局 IPython,或在每个虚拟环境中都安装一个。为了开始使用 IPython,直接在终端窗口中输入 ipython。你应该会看到一个类似这样的提示:

  1. $ ipython
  2. Python 2.7.6 (default, Mar 22 2014, 22:59:56)
  3. Type "copyright", "credits" or "license" for more information.
  4. IPython 1.2.1 -- An enhanced Interactive Python.
  5. ? -> Introduction and overview of IPython's features.
  6. %quickref -> Quick reference.
  7. help -> Python's own help system.
  8. object? -> Details about 'object', use 'object??' for extra details.
  9. In [1]:

现在你可以输入 Python 命令,就像在普通的 Python shell 中一样。例如:

  1. In [1]: 1 + 1
  2. Out[1]: 2
  3. In [2]: from datetime import datetime
  4. In [3]: datetime.now()
  5. Out[3]: datetime.datetime(2015, 9, 13, 11, 47, 49, 191842)

当需要退出 shell 时,你可以输入 quit()exit(),或者在 Windows/Linux 上输入 Ctrl-D,在 Mac 上输入 Cmd-D。

F.3 魔法函数

IPython 有大量所谓的魔法函数,能在探索和编程的时候帮助你。这里有一些非常重要的函数,特别是对于初级开发者来说。

为了看到你已经导入和活动的对象,可以输入 %whos%who。让我们看一下它们的用法:

  1. In [1]: foo = 1 + 4
  2. In [2]: bar = [1, 2, 4, 6]
  3. In [3]: from datetime import datetime
  4. In [4]: baz = datetime.now()
  5. In [5]: %who
  6. bar baz datetime foo
  7. In [6]: %whos
  8. Variable Type Data/Info
  9. --------------------------------
  10. bar list n=4
  11. baz datetime 2015-09-13 11:53:29.282405
  12. datetime type <type 'datetime.datetime'>
  13. foo int 5

在你忘记了变量名称或者想要通过一个简洁的列表看到在变量中存储的内容时,这非常有用。

另外一个有用的工具是快速查找与库、类或对象相关的文档的能力。如果你在方法、类、库或属性名称的最后输入一个 ?,IPython 会尝试获取所有相关的文档,内联地展示它。举个例子:

  1. In [7]: datetime.today?
  2. Type: builtin_function_or_method
  3. String Form:<builtin method today of type object at 0x7f95674e0a00>
  4. Docstring: Current date or datetime:
  5. same as self.__class__.fromtimestamp(time.time()).

有大量与此类似的 IPython 扩展和函数,对开发极其有用,特别是随着你作为一名开发者不断成长,碰到更加复杂的问题时。表 F-1 列出了最为有用的几个工具,网络上还有一些非常棒的演讲稿和会议演讲(http://ipython.org/presentation.html)以及交互示例(http://nbviewer.jupyter.org/github/ipython/ipython/blob/master/examples/Index.ipynb),此外还有关于库的非常棒的文档(http://ipython.org/documentation.html)。

附录 F IPython 指南 - 图1 所有的 IPython 扩展必需在 IPython 会话的开始使用 %load_ext extension_name 加载。如果你想要安装额外的扩展,GitHub 上有一个非常棒的可用扩展及其使用方式的列表(https://github.com/ipython/ipython/wiki/Extensions-Index)。

表F-1:有用的IPython扩展与函数

命令 描述 目的 文档
%autoreload 允许你只通过一次调用重新加载所有导入的脚本 在编辑器中修改脚本、在 IPython shell 中调试脚本,进行活跃开发的时候,非常有帮助 http://ipython.org/ipython-doc/dev/config/extensions/autoreload.html
%store 允许你存储保存的变量,在下一个会话中使用 在需要保存一些经常使用的变量,或者你的工作被中断因而需要保存当前的工作供以后使用时,非常有帮助 http://ipython.org/ipython-doc/dev/config/extensions/storemagic.html
%history 打印你的会话历史 展示你已经运行过的命令的输出 https://ipython.org/ipython-doc/dev/interactive/magics.html#magic-history
%pdb 用于过程较长的调用的交互式调试模块 强有力的调试库,在导入了较长的脚本或模块时特别有用 https://ipython.org/ipython-doc/dev/interactive/magics.html#magic-pdb
%pylab 引入 numpymatplotlib 来与你的会话交互式工作 允许你在 IPython shell 中使用统计和图表工具 https://ipython.org/ipython-doc/dev/interactive/magics.html#magic-pylab
%save 保存你的会话历史到一个输出文件 如果你花费了很长的时间调试,这是一个开始编写脚本的好方式 https://ipython.org/ipython-doc/dev/interactive/magics.html#magic-save
%timeit 计算代码中一行代码或多行代码的执行时间 用于对 Python 脚本和函数进行性能调优 https://ipython.org/ipython-doc/dev/interactive/magics.html#magic-timeit

还有很多可用的魔法命令(https://ipython.org/ipython-doc/dev/interactive/magics.html)。它们的有用性取决于你在开发中使用 IPython 的方式,但是随着你作为一名开发者不断成长,使用它们会通过 IPython 为你简化其他的任务。

F.4 最后的思考:一个简单的终端

无论是只在一个 notebook 中,还是在一个活跃的终端开发中使用 IPython,我们相信它会帮助你编写和理解 Python,并且帮助你成长为一个优秀的开发者。你早期的开发主要是探索 Python 如何工作,以及在开发过程中会遇到的错误和异常。IPython 对这些任务很在行,因为你可以在下一行输入中重试代码。我们希望 IPython 会在未来数年伴随你学习和编写 Python。