浅尝辄止

理论是灰色的,而生命之树常青。这里是@Dilettante258 的个人博客,用于记载和分享学习。

IPython和Jupyter Notebooks

Dilettante258's avatar
| 0 views

Tab补全

在shell中输入表达式,按下Tab,会搜索已输入变量(对象、函数等等)的命名空间

In [1]: an_apple = 27
In [2]: an_example = 42
In [3]: an<Tab>
an_apple    and         an_example  any

也可以补全任何对象的方法和属性:

In [3]: b = [1, 2, 3]
In [4]: b.<Tab>
b.append  b.count   b.insert  b.reverse
b.clear   b.extend  b.pop     b.sort
b.copy    b.index   b.remove

也适用于模块:

In [1]: import datetime

In [2]: datetime.<Tab>
datetime.date          datetime.MAXYEAR       datetime.timedelta
datetime.datetime      datetime.MINYEAR       datetime.timezone
datetime.datetime_CAPI datetime.time          datetime.tzinfo

当输入看似文件路径时(即使是Python字符串),按下Tab也可以补全电脑上对应的文件信息:

In [7]: path = 'datasets/movielens/<Tab>
datasets/movielens/movies.dat    datasets/movielens/README
datasets/movielens/ratings.dat   datasets/movielens/users.dat

自省

在变量前后使用问号?,可以显示对象的信息。

如果对象是一个函数或实例方法,定义过的文档字符串,也会显示出信息。使用??会显示函数的源码。

?还有一个用途,就是像Unix或Windows命令行一样搜索IPython的命名空间。字符与通配符结合可以匹配所有的名字。例如,我们可以获得所有包含load的顶级NumPy命名空间:

In [13]: np.*load*?
np.__loader__
np.load
np.loads
np.loadtxt
np.pkgload

%run命令

你可以用%run命令运行所有的Python程序。

In [14]: %run ipython_script_test.py

在Jupyter notebook中,你也可以使用%load,它将脚本导入到一个代码格

>>> %load ipython_script_test.py

    def f(x, y, z):
        return (x + y) / z
    a = 5
    b = 6
    c = 7.5

    result = f(a, b, c)

中断运行的代码

代码运行时按Ctrl-C,都会导致KeyboardInterrupt。这会导致几乎所有Python程序立即停止,除非一些特殊情况。

从剪贴板执行程序

如果使用Jupyter notebook,你可以将代码复制粘贴到任意代码格执行。在IPython shell中也可以从剪贴板执行。

最简单的方法是使用%paste%cpaste函数。%paste可以直接运行剪贴板中的代码.

%cpaste功能类似,但会给出一条提示:

In [18]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:x = 5
:y = 7
......

使用%cpaste,你可以粘贴任意多的代码再运行。你可能想在运行前,先看看代码。如果粘贴了错误的代码,可以用Ctrl-C中断。

键盘快捷键

Ipython快捷键:

快捷键说明
Ctrl-P 或↑箭头用当前输入的文本搜索之前的命令
Ctrl-N或↓箭头用当前输入的文本搜索之后的命令
CtrI-RReadline 方式翻转历史搜索(部分匹配)
Ctrl-shift-V从剪贴板粘贴文本
CtrI-C中断运行的代码
Ctrl-A将光标移动到一行的开头
Ctrl-E将光标移动到一行的末尾
Ctrl-K删除光标到行尾的文本
CtrI-U删除当前行的所有文本
Ctrl-F光标向后移动一个字符
Ctrl-B光标向前移动一个字符
CtrI-L清空屏幕

Jupyter notebook快捷键:

快捷键说明
Mswitch to markdown
Acreate celIs above
Bcreate cells below
D+Ddelete cell
Yswitch to code
Ctrl+Enterrun cell and stay on cell
Shift+Enterrun cell and go to next

魔术命令

IPython中特殊的命令(Python中没有)被称作“魔术”命令。这些命令可以使普通任务更便捷,更容易控制IPython系统。魔术命令是在指令前添加百分号%前缀。例如,可以用%timeit(这个命令后面会详谈)测量任何Python语句,例如矩阵乘法,的执行时间:

In [20]: a = np.random.randn(100, 100)

In [20]: %timeit np.dot(a, a)
10000 loops, best of 3: 20.9 µs per loop

魔术命令可以被看做IPython中运行的命令行。许多魔术命令有“命令行”选项,可以通过?查看:

In [21]: %debug?
Docstring:
::

  %debug [--breakpoint FILE:LINE] [statement [statement ...]]

Activate the interactive debugger.
......

魔术函数默认可以不用百分号,只要没有变量和函数名相同。这个特点被称为“自动魔术”,可以用%automagic打开或关闭。

一些魔术函数与Python函数很像,它的结果可以赋值给一个变量:

In [22]: %pwd
Out[22]: '/home/wesm/code/pydata-book

In [23]: foo = %pwd

In [24]: foo
Out[24]: '/home/wesm/code/pydata-book'

IPython的文档可以在shell中打开,我建议你用%quickref%magic学习下所有特殊命令。下表列出了一些可以提高生产率的交互计算和Python开发的IPython指令。

命令说明
%quickref显示 IPython 的快速参考。
%magic显示所有魔术命令的详细文档。
%debug在出现异常的语句进入调试模式。
%hist打印命令的输入 (可以选择输出) 历史
%pdb出现异常时自动进入调试。
%paste执行剪贴板中的代码。
%cpaste开启特别提示,手动粘贴待执行代码。
%reset删除所有命名空间中的变量和名字。
%page OBJECT美化打印对象,分页显示。
%run script.py运行代码。
%prun statement用 CProfile 运行代码,并报告分析器输出。
%time statement报告单条语句的执行时间。
%timeit statement多次运行一条语句,计算平均执行时间。适合执行时间短的代码
%who, %who ls %whos显示命名空间中的变量,三者显示的信息级别不同。
%xdel variable删除一个变量,并清空任何对它的引用。

集成Matplotlib

IPython在分析计算领域能够流行的原因之一是它非常好的集成了数据可视化和其它用户界面库,比如matplotlib。不用担心以前没用过matplotlib,本书后面会详细介绍。%matplotlib魔术函数配置了IPython shell和Jupyter notebook中的matplotlib。这点很重要,其它创建的图不会出现(notebook)或获取session的控制,直到结束(shell)。

在IPython shell中,运行%matplotlib可以进行设置,可以创建多个绘图窗口,而不会干扰控制台session:

In [26]: %matplotlib
Using matplotlib backend: Qt4Agg

在JUpyter中,命令有所不同(图2-6):

In [26]: %matplotlib inline