Skip to content

input_output_history

IPython 会详细记录你在会话期间输入的命令及其产生的结果。此历史记录对于回顾你的工作、回想以前的命令和重复使用结果来说是无价的。

访问以前命令最简单的方法是在 IPython 控制台或 Jupyter Cell 中使用上下箭头键。这会在当前会话中滚动显示已执行的命令历史记录。

IPython 还提供了更有结构化的方式来访问历史记录:

IPython 将所有之前的输入(你键入的代码)存储在一个类似列表的对象 In 中。你可以使用其单元格编号(In[ ] 中显示的数字)来访问特定的输入。注意,In[0] 通常是一个空字符串。

In [1]: message = "Hello IPython"
In [2]: x = 10
In [3]: y = 20
In [4]: x + y
Out[4]: 30
In [5]: In[1]
Out[5]: 'message = "Hello IPython"'
In [6]: In[1:4] # 切片表示法可用
Out[6]: ['message = "Hello IPython"', 'x = 10', 'y = 20']

对于最后三个输入,还有一些简写变量:

  • _i:上一个输入。
  • _ii:上上一个输入。
  • _iii:上上上一个输入(前两个命令之前的输入)。
In [7]: _i # 单元格 [6] 的输入
Out[7]: 'In[1:4] # Slice notation works'
In [8]: _ii # 单元格 [5] 的输入
Out[8]: 'In[1]'
In [9]: _iii # 单元格 [4] 的输入
Out[9]: 'x + y'

此外,_ih(输入历史)是一个包含所有输入历史(作为字符串)的列表。

%history(或 %hist)魔术命令提供输入历史的格式化视图。

In [10]: %history
# 输出:
# message = "Hello IPython"
# x = 10
# y = 20
# x + y
# In[1]
# In[1:4] # 切片表示法可用
# _i # 单元格 [6] 的输入
# _ii # 单元格 [5] 的输入
# _iii # 单元格 [4] 的输入
# %history
In [11]: %history -n 4-6 # 显示行号 4 到 6 的历史记录
# 输出:
# 4: x + y
# 5: In[1]
# 6: In[1:4] # 切片表示法可用

IPython 还会缓存已执行单元格的结果(输出)。

输出存储在一个名为 Out 的类似字典的对象中,其中键是输出单元格编号(Out[ ]),值是结果。请注意,不产生输出的命令(例如赋值)在 Out 中不会有条目。

# 接上一个例子...
In [12]: Out
Out[12]:
{4: 30,
5: 'message = "Hello IPython"',
6: ['message = "Hello IPython"', 'x = 10', 'y = 20'],
7: 'In[1:4] # Slice notation works',
8: 'In[1]',
9: 'x + y'}

与输入类似,对于最后三个输出,也有一些简写变量:

  • _:上一个输出。
  • __:上上一个输出。
  • ___:上上上一个输出(前两个结果之前的输出)。
In [14]: result = x * y
Out[14]: 200
In [15]: _ # 上一个输出(来自单元格 14)
Out[15]: 200
In [16]: print(f"The last result was: {_}")
# 输出: 上一个结果是: 200
In [17]: __ # 来自单元格 13 的输出
Out[17]: 30
In [18]: ___ # 来自单元格 12 的输出
Out[18]:
{4: 30,
5: 'message = "Hello IPython"',
6: ['message = "Hello IPython"', 'x = 10', 'y = 20'],
7: 'In[1:4] # Slice notation works',
8: 'In[1]',
9: 'x + y'}

你还可以使用 _N 访问输出,其中 N 是输出单元格编号(例如,_4 等效于 Out[4])。

In [19]: _4
Out[19]: 30

_oh(输出历史)变量是 Out 字典的另一个名称。

输入/输出历史对于以下方面非常有用:

  • 调试(Debugging):轻松检查以前的输入和输出。
  • 重新运行命令:使用上下箭头或 %history。
  • 重复使用结果:将存储在 _、__、Out[N] 中的输出分配给新变量。
  • 构建新命令:在新表达式中组合以前的输入/输出。

了解如何访问和利用会话历史记录是高效使用 IPython 和 Jupyter 的关键。