重要
此文档涵盖 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