Historial de entrada y salida
Anteriormente, vimos que el shell de IPython le permite acceder a los comandos anteriores con las teclas de flecha hacia arriba y hacia abajo, o de manera equivalente, los atajos Ctrl-p/Ctrl-n. Además, tanto en el shell como en el cuaderno, IPython expone varias formas de obtener el resultado de los comandos anteriores, así como versiones de cadena de los propios comandos. Exploraremos esos aquí.
Objetos In
y Out
de IPython¶
A estas alturas, imagino que está bastante familiarizado con las solicitudes de estilo In[1]:
/Out[1]:
utilizadas por IPython. Pero resulta que estos no son solo una bonita decoración: dan una pista sobre cómo puede acceder a entradas y salidas anteriores en su sesión actual. Imagina que inicias una sesión que se ve así:
In [1]: import math
In [2]: math.sin(2)
Out[2]: 0.9092974268256817
In [3]: math.cos(2)
Out[3]: -0.4161468365471424
Hemos importado el paquete math
incorporado, luego calculamos el seno y el coseno del número 2. Estas entradas y salidas se muestran en el shell con In
/Out
, pero hay más: IPython en realidad crea algunas variables de Python llamadas In
y Out
que se actualizan automáticamente para reflejar este historial:
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}
El objeto In
es una lista, que realiza un seguimiento de los comandos en orden (el primer elemento de la lista es un marcador de posición para que In[1]
pueda referirse a el primer comando):
In [6]: print(In[1])
import math
El objeto Out
no es una lista sino un diccionario que asigna números de entrada a sus salidas (si las hay):
In [7]: print(Out[2])
0.9092974268256817
Tenga en cuenta que no todas las operaciones tienen salidas: por ejemplo, las sentencias import
y las sentencias print
no afectan la salida. Esto último puede resultar sorprendente, pero tiene sentido si considera que print
es una función que devuelve None
; para abreviar, cualquier comando que devuelva None
no se agrega a Out
.
Donde esto puede ser útil es si desea interactuar con resultados anteriores. Por ejemplo, verifiquemos la suma de sin(2)**2
y cos(2)**2
utilizando los resultados calculados previamente:
In [8]: Out[2] ** 2 + Out[3] ** 2
Out[8]: 1.0
El resultado es 1.0
como cabría esperar de la conocida identidad trigonométrica. En este caso, probablemente no sea necesario usar estos resultados anteriores, pero puede resultar muy útil si ejecuta un cálculo muy costoso y desea reutilizar el resultado.
Subrayar accesos directos y salidas anteriores¶
El shell estándar de Python contiene solo un atajo simple para acceder a la salida anterior; la variable _
(es decir, un solo guión bajo) se mantiene actualizada con la salida anterior; esto también funciona en IPython:
In [9]: print(_)
1.0
Pero IPython lleva esto un poco más lejos: puede usar un guión bajo doble para acceder a la penúltima salida, y un guión bajo triple para acceder a la penúltima salida (omitiendo cualquier comando sin salida):
In [10]: print(__)
-0.4161468365471424
In [11]: print(___)
0.9092974268256817
IPython se detiene allí: más de tres guiones bajos comienzan a ser un poco difíciles de contar, y en ese punto es más fácil referirse a la salida por número de línea.
Sin embargo, hay un atajo más que debemos mencionar: una forma abreviada de Out[X]
es _X
(es decir, un guión bajo simple seguido del número de línea):
In [12]: Out[2]
Out[12]: 0.9092974268256817
In [13]: _2
Out[13]: 0.9092974268256817
Supresión de salida¶
A veces, es posible que desee suprimir la salida de una declaración (esto es quizás más común con los comandos de trazado que exploraremos en Introducción a Matplotlib). O tal vez el comando que está ejecutando produce un resultado que preferiría que no quisiera almacenar en su historial de salida, tal vez para que pueda ser desasignado cuando se eliminen otras referencias. La forma más sencilla de suprimir la salida de un comando es agregar un punto y coma al final de la línea:
In [14]: math.sin(2) + math.cos(2);
Tenga en cuenta que el resultado se calcula de forma silenciosa y la salida no se muestra en la pantalla ni se almacena en el diccionario Out
:
In [15]: 14 in Out
Out[15]: False
Comandos mágicos relacionados¶
Para acceder a un lote de entradas anteriores a la vez, el comando mágico %history
es muy útil. Así es como puede imprimir las primeras cuatro entradas:
In [16]: %history -n 1-4
1: import math
2: math.sin(2)
3: math.cos(2)
4: print(In)
Como de costumbre, puede escribir %history?
para obtener más información y una descripción de las opciones disponibles. Otros comandos mágicos similares son %rerun
(que volverá a ejecutar una parte del historial de comandos) y %save
(que guarda parte del historial de comandos en un archivo) . Para obtener más información, sugiero explorarlos utilizando la función de ayuda ?
que se describe en Ayuda y documentación en IPython.