You are currently viewing История ввода и вывода

История ввода и вывода

Ранее мы видели, что оболочка 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 InOut которые автоматически обновляются, чтобы отразить эту историю:

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.