重要

此文档涵盖 IPython 6.0 及更高版本。从 6.0 版本开始,IPython 不再支持与低于 3.3 的 Python 版本(包括所有版本的 Python 2.7)的兼容性。

如果你正在寻找与 Python 2.7 兼容的 IPython 版本,请使用 IPython 5.x LTS 版本并参阅其文档(LTS 是长期支持版本)。

Python 与 IPython

此文档旨在突出 Python 语言的主要区别,以及你只能在 IPython 中执行的特定结构。

除非另有说明,否则如果你在纯 Python shell 中运行或在 Python 脚本中执行,这里看到的所有结构都将引发 SyntaxError

这些功能中的每一个都在文档的后面部分中有更详细的描述。

快速概览:

以下所有结构都是有效的 IPython 语法

In [1]: ?
In [1]: ?object
In [1]: object?
In [1]: *pattern*?
In [1]: %shell like --syntax
In [1]: !ls
In [1]: my_files = !ls ~/
In [1]: for i, file in enumerate(my_files):
   ...:     raw = !echo $file
   ...:     !echo {file[0].upper()} $raw
In [1]: %%perl magic --function
   ...: @months = ("July", "August", "September");
   ...: print $months[0];

IPython 将这些结构中的每一个编译成有效的 Python 代码,并且在大多数情况下会执行你期望它执行的操作。让我们更详细地了解每个示例。

访问帮助

由于 IPython 主要是一个交互式 shell,因此问号是一个获取帮助的简单快捷方式。单独的问号将显示 IPython 帮助

In [1]: ?

IPython -- An enhanced Interactive Python
=========================================

IPython offers a combination of convenient shell features, special commands
and a history mechanism for both input (command history) and output (results
caching, similar to Mathematica). It is intended to be a fully compatible
replacement for the standard Python interpreter, while offering vastly
improved functionality and flexibility.

At your system command line, type 'ipython -h' to see the command line
options available. This document only describes interactive features.

MAIN FEATURES
-------------
...

在当前名称空间中可用对象的前面或后面加上一个问号将显示与此对象相关的帮助

In [6]: object?
Docstring: The most base type
Type:      type

双问号将尝试提取有关对象的更多信息,如果可能,将显示此对象的 Python 源代码。

In[1]: import collections
In[2]: collections.Counter??

Init signature: collections.Counter(*args, **kwds)
Source:
class Counter(dict):
    '''Dict subclass for counting hashable items.  Sometimes called a bag
    or multiset.  Elements are stored as dictionary keys and their counts
    are stored as dictionary values.

    >>> c = Counter('abcdeabcdabcaba')  # count elements from a string

    >>> c.most_common(3)                # three most common elements
    [('a', 5), ('b', 4), ('c', 3)]
    >>> sorted(c)                       # list all unique elements
    ['a', 'b', 'c', 'd', 'e']
    >>> ''.join(sorted(c.elements()))   # list elements with repetitions
    'aaaaabbbbcccdde'
    ...

如果你正在寻找一个对象,则将通配符 * 与问号结合使用,将允许你在当前名称空间中搜索具有匹配名称的对象

In [24]: *int*?
FloatingPointError
int
print

Shell 分配

在进行交互式计算时,通常需要访问底层 shell。这可以通过使用感叹号 !(或感叹号)来实现。

这允许在行首存在时执行简单命令

In[1]: !pwd
/User/home/

更改目录

In[1]: !cd /var/etc

或编辑文件

In[1]: !mvim myfile.txt

感叹号后面的行可以调用底层 shell 中安装的任何程序,并支持 $variable{variable} 形式的变量扩展。后一种扩展形式支持任意 Python 表达式

In[1]: file = 'myfile.txt'

In[2]: !mv $file {file.upper()}

感叹号 (!) 也可以出现在赋值的右侧,紧跟等号之后,或用空格与之隔开。在这种情况下,感叹号后面的命令的标准输出将被拆分为列表状对象中的行,并分配给左侧。

例如,这允许你将当前工作目录的文件列表放入变量中

In[1]: my_files = !ls

你可以在 for 循环、条件、函数中组合不同的可能性...

my_files = !ls ~/
for i, file in enumerate(my_files):
    raw = !echo $backup $file
    !cp $file {file.split('.')[0] + '.bak'}

Magics

Magic 函数(magics)通常以 shell 类似的语法形式出现,但它们本质上是 Python 函数。语法和赋值可能性与感叹号 (!) 语法相似,但更灵活、更强大。Magic 函数以百分号 (%) 或双百分号 (%%) 开头。

带有单个百分号的 magic 调用只作用于一行

In[1]: %xmode
Exception reporting mode: Verbose

Magics 支持赋值

In [1]: results = %timeit -r1 -n1 -o list(range(1000))
62.1 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)

In [2]: results
<TimeitResult : 62.1 µs ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)>

带有双百分号 (%%) 的 Magics 可以跨多行,但它们不支持赋值

In[1]: %%bash
...  : echo "My shell is:" $SHELL
...  : echo "My disk usage is:"
...  : df -h
My shell is: /usr/local/bin/bash
My disk usage is:
Filesystem      Size   Used  Avail Capacity  iused   ifree %iused  Mounted on
/dev/disk1     233Gi  216Gi   16Gi    94% 56788108 4190706   93%   /
devfs          190Ki  190Ki    0Bi   100%      656       0  100%   /dev
map -hosts       0Bi    0Bi    0Bi   100%        0       0  100%   /net
map auto_home    0Bi    0Bi    0Bi   100%        0       0  100%   /hom