<jupyter_start><jupyter_text>Módulo  `IPython.display`El módulo [`IPython.display`](https://ipython.readthedocs.io/en/stable/api/generated/IPython.display.html) está instalado por defecto con el kernel de IPythonLa función principal de este módulo es```pythondisplay(*objs,  Una tupla de objetos de Python        ...)```Esta función al igual que `print`, imprime el valor de los objetos de PythonSin embargo, `display` no está limitado a mostrar strings, como veremos en este apartado  Diferencia entre `print` y `display`La forma en que se imprime un objeto con `print` o `display` está dado por los métodos [`__str__`](https://docs.python.org/3/reference/datamodel.htmlobject.__str__) y [`__repr__`](https://docs.python.org/3/reference/datamodel.htmlobject.__repr__) de dicho objeto, respectivamenteLos objetos nativos de `Python` (por ejemplo las listas) ya tienen estos métodos definidosObserve las diferencias entre `print` y `display` para las siguientes clases<jupyter_code>class Fruta:
    def __init__(self, color, nombre):
        self.color = color
        self.nombre = nombre
        
foo = Fruta('rojo', 'manzana')
print(foo)
display(foo)<jupyter_output><empty_output><jupyter_text>`display` no imprime `__str__`:<jupyter_code>class Fruta_str(Fruta): # Esta clase hereda de Fruta        
    def __str__(self): # y le agrega este atributo
        return f'Soy una {self.nombre} de color {self.color}'
    
foo = Fruta_str('rojo', 'manzana')
print(foo)
display(foo)<jupyter_output><empty_output><jupyter_text>- `print` imprime `__repr__` si no encuentra `__str__`- `display` imprime `__repr__`<jupyter_code>class Fruta_repr(Fruta): # Esta clase hereda de Fruta        
    def __repr__(self): # y le agrega este atributo
        return f'Soy una {self.nombre} de color {self.color}'
    
foo = Fruta_repr('rojo', 'manzana')
print(foo) 
display(foo)<jupyter_output><empty_output><jupyter_text>Adicionalmente display acepta el método `_repr_html_` que permite imprimir con formato HTML`print` ignora este método<jupyter_code>class Fruta_repr_nice(Fruta): # Esta clase hereda de Fruta        
    def _repr_html_(self): # y le agrega este atributo
        return f'<p style="color:blue">Soy una {self.nombre} de color {self.color}</p>'
    
foo = Fruta_repr_nice('rojo', 'manzana')
print(foo)
display(foo)<jupyter_output><empty_output><jupyter_text>Imprimiendo imágenes con el objeto `Image`Usando `Image` podemos mostrar una imagen en formato JPG, PNG o GIF que esté en nuestro disco duro o una URL Para mostrar una imagen llamada `mi_imagen.jpg` en nuestro directorio local ```pythonfrom IPython.display import Imagedisplay(Image(filename="mi_imagen.jpg"))```Se debe especificar al menos uno de los siguientes argumentos```pythonImage(data,  Tira binaria que representa una imagen, requiere especificar format (abajo)      url,  dirección web a un archivo en una página web      filename,  dirección local a un archivo en nuestro disco duro      ...     )```Los siguientes argumentos son opcionales```pythonImage(...      format,  String, formato de la imagen, solo necesario para la entrada data      embed,  Bool, indica si el archivo se guardará en la metadata del notebook      width,  Entero, ancho del cuadro a mostrar, por defecto se usa el tamaño real de la imagen      height,  Entero, alto del cuadro a mostrar      ...     )``` **Ejemplo**<jupyter_code>from IPython.display import Image
display(Image('img/valdivia.png'))<jupyter_output><empty_output><jupyter_text>:::{note}También se puede mostrar una imagen con `matplotlib` importándola con `imread` y dibujándola con `imshow`. Si sólo nos interesa mostrar la imagen y no vamos a ocupar su data entonces `Image` es más conveniente:::  Reproducción de sonido con el objeto `Audio`Este objeto crea un reproductor de sonido con controles play/pause a partir de un archivo de audio, una URL o un arreglo de datos, por ejemplo```pythonfrom IPython.display import Audiodisplay(Audio(filename="mi_audio.ogg"))```Se debe especificar al menos uno de los siguientes argumentos```pythonAudio(data,  Lista o ndarray que se interpreterá como audio crudo de uno (mono) o dos canales (stereo)      url,  dirección web a un archivo en una página web      filename,  dirección local a un archivo en nuestro disco duro      ...     )```El tipo de archivo soportado depende del browser (wav y ogg funcionan por defecto)Los siguientes argumentos son opcionales```pythonAudio(...      embed,  Bool, indica si el archivo se guardará en la metadata del notebook      rate,  Entero, especifica la frecuencia de muestreo si usamos data (nota abajo)      autoplay,  Bool, indica si el sonido debe empezar a reproducirse inmediatamente      normalize,  Bool, indica si se debe reescalar el sonido entre [-1,1]      ...     )``` **Ejemplo**Crearemos un tono fundamental en 440 Hz, es decir la nota A4 (La) utilizando NumPy y lo reproducimos utilizando Audio<jupyter_code>from IPython.display import Audio
import numpy as np
Fs = 48000
time = np.arange(0, 2, step=1./Fs) # 2 segundos de audio
data = 0.1*np.cos(2.0*np.pi*time*440)
display(Audio(data, rate=Fs, normalize=False))<jupyter_output><empty_output><jupyter_text>:::{note}Para poder interpretar el arreglo como un audio es suficiente especificar la frecuencia de muestreo, por ejemplo 44100 o 48000Hz y asegurar que los valores del arreglo son flotantes en el range [-1, 1]:::  Reproducción de video con el objeto  `Video`Crea un reproductor con los mismos controles del objeto `Audio` para un archivo de videoEl archivo puede estar en nuestro disco duro en una URLSe usa de forma equivalente a `Image` (mismos argumentos)Adicionalmente existen los objetos `YouTubeVideo` y `VimeoVideo` para embeber videos de estas plataformas **Ejemplo:**<jupyter_code>from IPython.display import YouTubeVideo
display(YouTubeVideo("ywWBy6J5gz8"))<jupyter_output><empty_output><jupyter_text>Código fuente formateado con el objeto `Code`Este objeto imprime código fuente con colores la sintáxis, sus argumentos son```pythonCode(data=None,  Un string con código fuente     url=None,   Una URL a un archivo de código fuente en un servidor     filename=None,  Un archivo de código fuente en nuestro disco duro     language=None  Para especificar el lenguaje que se usará para resaltar color    )``` **Ejemplo**<jupyter_code>from IPython.display import Code
display(Code("script_interesante.py"))<jupyter_output><empty_output><jupyter_text>Mostrando Objeto `HTML`Muestra una página web o un fragmento de página web escrito en HTML```pythonHTML(data=None,  String, texto plano en lenguaje HTML     url=None,  Una URL a un archivo HTML     filename=None,  Una ruta a un archivo HTML en nuestro sistema     ...    )``` **Ejemplo**<jupyter_code>from IPython.display import HTML

codigo_html = '<p style="font-size:20pt;color:blue;"><NAME>\n</p>'
display(HTML(codigo_html))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.0895088637024121, 'fraction_numerical': 0.0059575704736995055, 'mean_word_length': 4.949006050129646, 'pattern_counts': {'":': 0, '<': 42, '<?xml version=': 0, '>': 42, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '376662', 'license': 'Unlicense', 'n_tokens_mistral': 2335, 'n_tokens_neox': 2281, 'n_words': 771, 'path': 'contents/jupyter/ipython_display.ipynb', 'repo_name': 'phuijse/PythonBook', 'size': '6888'}