Ранее мы видели, что оболочка IPython позволяет вам получать доступ к предыдущим командам с помощью клавиш со стрелками вверх и вниз или, что эквивалентно, сочетаний клавиш Ctrl-p/Ctrl-n. Кроме того, как в оболочке, так и в ноутбуке IPython предоставляет несколько способов получения выходных данных предыдущих команд, а также строковых версий самих команд. Мы рассмотрим их здесь.
IPython In
и Out
объекты
К настоящему времени, я полагаю, вы уже хорошо знакомы с In [1]: Out[1]:
подсказками / style, используемыми IPython. Но оказывается, что это не просто красивое украшение: они дают представление о том, как вы можете получить доступ к предыдущим входам и выходам в вашей текущей сессии. Представьте, что вы начинаете сеанс, который выглядит так:
In [1]: import math
In [2]: math.sin(2)
Out[2]: 0.9092974268256817
In [3]: math.cos(2)
Out[3]: -0.4161468365471424
Мы импортировали встроенный math
пакет, затем вычислили синус и косинус числа 2. Эти входы и выходы отображаются в оболочке с InOut
метками/, но есть и другие–IPython фактически создает некоторые вызываемые переменные Python In
, Out
которые автоматически обновляются, чтобы отразить эту историю:
In [4]: print(In)
['', 'import math', 'math.sin(2)', 'math.cos(2)', 'print(In)']
In [5]: Out
Out[5]: {2: 0.9092974268256817, 3: -0.4161468365471424}
In
Объект представляет собой список, который отслеживает команды по порядку (первый элемент в списке-это держатель места, который In[1]
может ссылаться на первую команду).:
In [6]: print(In[1])
import math
Out
Объект представляет собой не список, а словарь, сопоставляющий входные номера с их выходными данными (если таковые имеются).:
In [7]: print(Out[2])
0.9092974268256817
Обратите внимание, что не все операции имеют выходные данные: например, import
операторы и print
операторы не влияют на выходные данные. Последнее может показаться удивительным, но имеет смысл, если учесть, что print
это функция, которая возвращает None
; для краткости любая возвращаемая команда None
не добавляется Out
.
Это может быть полезно, если вы хотите взаимодействовать с прошлыми результатами. Например, давайте проверим сумму sin(2) ** 2
и cos(2) ** 2
используем ранее вычисленные результаты:
In [8]: Out[2] ** 2 + Out[3] ** 2
Out[8]: 1.0
Результат таков 1.0
, как мы и ожидали бы от хорошо известного тригонометрического тождества. В этом случае использование этих предыдущих результатов, вероятно, не требуется, но это может оказаться очень удобным, если вы выполняете очень дорогостоящие вычисления и хотите повторно использовать результат!
Подчеркивание ярлыков и предыдущих результатов
Стандартная оболочка Python содержит только один простой ярлык для доступа к предыдущим выводам; переменная _
(т. Е. Единственное подчеркивание) обновляется с учетом предыдущего вывода; это также работает в IPython:
In [9]: print(_)
1.0
Но IPython делает это немного дальше — вы можете использовать двойное подчеркивание для доступа к предпоследнему выводу и тройное подчеркивание для доступа к предпоследнему выводу (пропуская любые команды без вывода).:
In [10]: print(__)
-0.4161468365471424
In [11]: print(___)
0.9092974268256817
На этом IPython останавливается: более трех символов подчеркивания становится немного сложно сосчитать, и в этот момент проще ссылаться на вывод по номеру строки.
Однако есть еще один короткий путь, который мы должны упомянуть,–сокращение для Out[X]
is _X
(т. е. Одно подчеркивание, за которым следует номер строки).:
In [12]: Out[2]
Out[12]: 0.9092974268256817
In [13]: _2
Out[13]: 0.9092974268256817
Подавление Выходного сигнала
Иногда вам может потребоваться подавить вывод инструкции (это, возможно, наиболее часто встречается с командами построения графиков, которые мы рассмотрим во введении в Matplotlib). Или, может быть, команда, которую вы выполняете, дает результат, который вы предпочли бы не хранить в своей истории вывода, возможно, чтобы его можно было освободить при удалении других ссылок. Самый простой способ подавить вывод команды-добавить точку с запятой в конец строки:
In [14]: math.sin(2) + math.cos(2);
Обратите внимание, что результат вычисляется автоматически, а выходные данные не отображаются на экране и не сохраняются в Out
словаре:
In [15]: 14 in Out
Out[15]: False
Связанные Магические Команды
Для одновременного доступа к пакету предыдущих входных данных %history
очень полезна команда magic. Вот как вы можете распечатать первые четыре ввода:
In [16]: %history -n 1-4
1: import math
2: math.sin(2)
3: math.cos(2)
4: print(In)
Как обычно, вы можете ввести %history?
дополнительную информацию и описание доступных опций. Другими подобными волшебными командами являются %rerun
(которые повторно выполняют некоторую часть истории команд) и %save
(которые сохраняют некоторый набор истории команд в файл). Для получения дополнительной информации я предлагаю изучить их ?
с помощью функций справки, описанных в Справке и документации в IPython.