LaTeX – Más cajas de texto horizontales

Objetivo: presentar con más profundidad los comandos que permiten crear cajas horizontales en LaTeX.

En el artículo anterior introdujimos el modo LR y mostramos el comando mbox, que activaba ese modo para la creación de una sencilla caja horizontal. Hoy profundizaremos presentando unos comandos que nos permitirán unos diseños más avanzados.

Si recuerdas, mbox es un sastre que crea un traje perfectamente a medida, una caja adaptada rigusoramente al texto que se especifica como parámetro. Pero es un traje invisible: en el resultado final puede que ni siquiera seamos capaz de diferenciar la existencia de la caja. Y es que el comando mbox cumple su misión sin necesidad de llamar la atención.

Para hacer visible nuestra caja LR, LaTeX nos ofrece el comando fbox que, al igual que mbox, crea una contenedor del tamaño exacto del texto, pero con la particularidad de que aparecece encuadrado en un marco.

mascajaslatex-1

\documentclass{article}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{parskip}

\begin{document}
Si eres músico, es importante que, de cuando en cuando, 
acudas al otorrinolaringólogo a revisar tu audición.

Si eres músico, es importante que, de cuando en cuando, 
acudas al \mbox{otorrinolaringólogo} a revisar tu audición.

Si eres músico, es importante que, de cuando en cuando, 
acudas al \fbox{otorrinolaringólogo} a revisar tu audición.
\end{document}

En el primer párrafo, la palabra otorrinolaringólogo está escrita con normalidad, sin caja, permitiendo a LaTeX dividirla, como sucede en el ejemplo, para una mejor presentación. En los párrafos segundo y tercero se enmarca con mbox y fbox, respectivamente, preservando su longitud total y evitando así su división.

Es posible también arreglar el traje y no cortarlo necesariamente a medida, sino a la longitud que queramos, aún pudiéndonos quedar paticortos o con los bajos arrastrando por el suelo.

El comando makebox es una variante de mbox que permite crear una caja de la anchura especificada, pudiendo indicar, además, el tipo de justificación que tendrá el texto dentro de ella:

\makebox[anchura][justificación]{texto}

Observa, por el corchete, que tanto anchura como justificación son opcionales.

En el parámetro anchura introducimos una medida de longitud (es importante no olvidar las unidades junto al valor numérico). En justificación podemos indicar l, r o c para expresar justificación izquierda (l), derecha (r) o centrado (c). El valor por omisión, si no se indica nada, es c, apareciendo el texto centrado en la caja.

Un ejemplo nos ayudará a entenderlo mejor:

mascajaslatex-2

\begin{document}
Ya no echan series como \mbox{La casa de la pradera}, 
es una verdadera lástima.

Ya no echan series como \makebox[6cm][c]{La casa de la pradera}, 
es una verdadera lástima.

Ya no echan series como \makebox[6cm][l]{La casa de la pradera}, 
es una verdadera lástima.

Ya no echan series como \makebox[6cm][r]{La casa de la pradera}, 
es una verdadera lástima.
\end{document}

El primer párrafo hace uso de mbox, ajustando la caja a la medida del texto. En los siguientes establecemos una anchura de 6 cm, observando su justificación centrada, izquierda o derecha.

La caja creada tiene anchura suficiente para acoger el texto que contiene, pero podría darse el caso de que no. Observa qué sucede si el traje se nos queda corto:

mascajaslatex-3

\begin{document}
Ya no echan series como \makebox[2cm][c]{La casa de la pradera}, 
es una verdadera lástima.

Ya no echan series como \makebox[2cm][l]{La casa de la pradera}, 
es una verdadera lástima.

Ya no echan series como \makebox[2cm][r]{La casa de la pradera}, 
es una verdadera lástima.
\end{document}

La caja tiene una anchura de 2cm, quepa o no quepa su contenido en ella. LaTeX la considera como si de un único carácter se tratase, escribiendo el siguiente justo a continuación de la caja, lo que explica la superposición de texto.

Naturalmente, al igual que sucedía con mbox, el comando makebox tiene su versión con marco: framebox.

mascajaslatex-4

\begin{document}
Ya no echan series como \framebox[6cm][c]{La casa de la pradera}, 
es una verdadera lástima.

Ya no echan series como \framebox[6cm][l]{La casa de la pradera}, 
es una verdadera lástima.

Ya no echan series como \framebox[6cm][r]{La casa de la pradera}, 
es una verdadera lástima.
\end{document}

Para finalizar, si eres un usuario de LaTeX inquieto debes saber qué hay dos longitudes que permiten controlar la estética de estas cajas. Puedes regular el ancho del marco con fboxrule y su separación del texto con fboxsep. Al igual que otras longitudes LaTeX, su valor se establece con el comando setlength, del que creo haber hablado ya en alguna que otra ocasión.

mascajaslatex-5

\begin{document}
\setlength{\fboxrule}{1mm}
\setlength{\fboxsep}{6mm}
Ya no echan series como \framebox[6cm][c]{La casa de la pradera}, 
es una verdadera lástima.

\setlength{\fboxrule}{4mm}
\setlength{\fboxsep}{6mm}
Ya no echan series como \framebox[6cm][l]{La casa de la pradera}, 
es una verdadera lástima.

\setlength{\fboxrule}{.1mm}
\setlength{\fboxsep}{0mm}
Ya no echan series como \framebox[6cm][r]{La casa de la pradera}, 
es una verdadera lástima.
\end{document}

Fíjate en el último ejemplo, con un parámetro de separación nulo (aunque sea cero es preceptivo el uso de unidades): el marco aparece ajustado al límite más alto y bajo de los caracteres contenidos (letras L y p).

A lo largo de los años que llevo trabajando con LaTeX nunca he dejado de aprender, se trate de un comando nativo o de uno englobado en un paquete que extiende su funcionalidad. Cuidadosamente, he ido construyendo mi propio manual de referencia con cada pieza que he ido encontrando en el camino. El universo LaTeX es casi inconmensurable y recomiendo encarecidamente que hagas lo mismo. Si las cajitas de este artículo no forman parte aún de tu repertorio de técnicas, toma buena nota de ellas.

Javier Montero Gabarró


LaTeX – Más cajas de texto horizontales


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Índice completo de artículos relacionados con \LaTeX.

Construcción de acordes – 25: Power Chords

Objetivo: ilustrar la formación del acorde de quinta, también conocido como Power Chord.

Un amable lector del blog me preguntaba hace unos días por la formación de este tipo de acordes, apreciando su ausencia en la tabla de referencia de la serie dedicada a su construcción. Es cierto que, para muchos, el power chord, o acorde de quinta, no es digno de ser clasificado como acorde, aunque aquí no le haremos ese feo. Ligado indefectiblemente a determinados estilos musicales y al uso de guitarras eléctricas con fuerte distorsión, qué sería de nuestra historia musical sin su potencia expresiva.

Su formación es muy simple:

Power Chord (acorde de quinta): 1 – 5

No es más que la fundamental y una quinta justa sobre ella.

La notación no ofrece ningún misterio, tampoco: agregamos el número 5 a la letra de la nota fundamental (C5, Bb5, …).

Repetiremos en primer lugar el procedimiento de cálculo que hemos empleado en los restantes acordes de la serie aunque, dada su sencillez, facilitaré a continuación un método más rápido alternativo.

Hallemos, por ejemplo, las notas que integran los acordes C5 y Bb5.

Comenzamos, como siempre, registrando las respectivas escalas mayores, Do mayor y Si bemol mayor:

Do mayor: C – D – E – F – G – A – B
Si bemol mayor: Bb – C – D – Eb – F – G – A

Tomamos los grados indicados en la fórmula, esto es, el 1 y el 5:

C5: C – G
Bb5: Bb – F

Pero para esta simple operación no era necesario tanto despliegue. Por si aún no estuvieras habituado a contar quintas justas de una forma rápida voy a explicarte cómo hacerlo. Tienes a tu disposición, también, en el blog, los siete artículos, entre teóricos y prácticos, dedicados a la formación de intervalos en general.

Basta con saber que una quinta justa a partir de cualquier nota natural (es decir, sin sostenidos ni bemoles), es otra nota natural, a excepción de la construida sobre SI. En efecto, la distancia entre SI y su quinta natural, FA, es una quinta disminuida. Cuenta los semitonos que hay entre ambas y verás que te salen seis, en vez de los siete que constituyen la quinta justa, que seria FA# en este caso.

De modo que calcular quintas justas no es más que contar hasta cinco teniendo en cuenta lo explicado anteriormente. Calculemos unas cuantas:

C5

Contamos 5 sobre DO (incluyéndolo): DO – RE – MI – FA – SOL

La quinta es SOL, y como DO es natural, la quinta justa también lo es.

C5: C – G

Eb5

Contamos cinco sobre MI (nos olvidamos del bemol de momento, hasta la segunda parte del cálculo): E – F – G – A – B

La quinta es SI, que además es justa. Pero como la nota inicial real, MI bemol, está un semitono por debajo de MI, a la nota SI obtenida le quitamos otro semitono también, de modo que:

Eb5: Eb – Bb

Bb5

Contamos 5 sobre SI (nos olvidamos del bemol, de momento): B – C – D – E – F. Ahora bien, hemos dicho que la quinta justa sobre una nota natural es natural a excepción de SI. De modo que la quinta justa sobre SI es FA sostenido en lugar de FA natural. Como la nota original era SI bemol (un semitono por debajo de SI), bajamos un semitono la quinta obtenida, FA#, obteniendo FA natural:

Bb5: Bb – F

Cuanto antes te acostumbres a contar quintas sin apenas pensar mejor. Son la base del círculo de quintas, que no consiste más que en poner en círculo quintas sucesivas: C, G, D, A, E, B, F#/Gb, C#/Db, G#/Ab, D#/Eb, A#/Bb, E#/F.

Veremos con más detalle el círculo de quintas y algunas de sus aplicaciones en otro artículo del blog. Ahora, lo que me han entrado ganas es de coger la guitarra, saturar el ampli y hacer mucho, mucho ruido. Celestial o demoníaco, a gusto de cada uno.

Javier Montero Gabarró


Construcción de acordes – 25: Power Chords


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Tabla de referencia de construcción de acordes.


Índice de todos los artículos de armonía.

10Km City Run RFEA Sevilla 2014

Sevilla - Street Run - SmallUna carrera especial que cada año espero con ilusión. El circuito anteriormente denominado Divina Pastora cambia de patrocinadores y ahora es 10Km City Run, haciendo escala en ciudades como Sevilla, Madrid (23/3), Oviedo (30/3), Valladolid (27/4), Mataró (31/5), Palma de Mallorca (7/6), Albacete (14/6) y Valencia (29/6).

Es especial por diversos motivos. Por un lado, es la carrera con la que abro oficialmente la temporada cada año, en un momento del invierno en el que en Sevilla ya casi huele a primavera. El recorrido es todo un lujo: comienza y termina el el Parque de María Luisa, bordeando completamente el centro histórico de la ciudad. Por si fuera poco, el trazado es completamente llano lo que, unido a la suave temperatura, hace que se junten las condiciones propicias para todos aquellos que deseen batir su marca personal en esta distancia.

Según la organización, el número de inscritos ha sido 1200, lo que me resulta quizás bajo comparándolo con otras ediciones anteriores. Posiblemente los doce euros de inscripción hayan echado atrás a más de uno. O tal vez tampoco haya hecho demasiada gracia tener que desplazarse hasta Mairena del Aljarafe para recoger el dorsal (encareciendo más el asunto). ¿Quién dice que correr es un deporte barato? Echad cuentas de lo que os podéis gastar al año en carreras, por no hablar, por supuesto, de la equipación.

Para plantear la carrera recurro, como hago habitualmente, al Virtual Partner de mi ForeRunner, que he puesto a correr a 5:30/Km. Mi objetivo es dejarlo atrás, aunque sólo sea por un metro, lo que me garantiza terminar la carrera en menos de 55 minutos. Ese ha sido el objetivo.

Salgo muy fuerte (subjetivamente hablando, desde luego), a 4:50/Km (esto sí es objetivo), dejando entre mi compañero virtual y yo una separación de un centenar de metros en muy poco tiempo. Esto es psicológicamente importante para mí. Me gusta tener margen suficiente entre ambos desde el primer momento. Si en algún momento las cosas se ponen mal, siempre puedo devolver algo de la ventaja adquirida.

Freno un poco, pero no tanto para dejar de ir siempre ganando metros. Activo el modo Sufrimiento ON. El resto es una cuestión de paciencia, dejando que los minutos y los kilómetros vayan sucediéndose uno tras otro.

Es curioso este deporte. Sufrimos desde el momento que salimos hasta que llegamos a la meta. Dejar de hacerlo sería tan sencillo como bajar el ritmo. Bastaría emplear un minuto más en cada kilómetro y garantizaríamos una carrera cómoda. Pero no es una opción; simplemente, no podemos. Activamos el piloto automático y aceptamos con resignación el sufrimiento constante. A nuestro ritmo, seamos corredores de 3:30 o de 6, pero siempre sufrimos.

Concluyo la carrera dejando a mi rival virtual a más de 400 metros tras de mí, lo que me ha supuesto finalizar en un tiempo oficial de 52′ 58″, a un ritmo medio de 5:15/Km. El GPS marcó los diez kilómetros en 52’30», por lo que, para él, la distancia recorrida ha excedido los 10Km en casi un centenar de metros más.

Objetivo cumplido. Marca que ya me garantiza un cajoncito cómodo (sub 55′) en la última carrera del año, la San Silvestre vallecana (otros 20 euros del ala). Corremos juntos un buen número de amigos y familiares, de modo que nos instalamos en el cajón correspondiente al peor tiempo de todos. Ahora les tocará a los demás ponerse las pilas. Lástima que por poco podría haber conseguido el derecho a la pulsera sub 52′. En cualquier caso, el resultado ha sido fantástico, logrando ampliamente el objetivo buscado.

Próxima carrera popular: Nervión – San Pablo, la primera del circuito del IMD en Sevilla. Nos vemos allí, a seguir sufriendo, cada uno a nuestro propio ritmo.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2014/03/10km-city-run-rfea-sevilla-2014/


Puedes consultar el índice completo de artículos pertenecientes a la categoría running.


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta

LaTeX – El modo LR y mbox

Objetivo: presentar el modo LR de LaTeX y el comando mbox para la creación de cajas horizontales.

\LaTeX presenta diferentes modos de operación. Ya conocemos algunos: el modo normal y el matemático.

El modo normal, también conocido como modo párrafo, es el que típicamente utilizamos en nuestros escritos en \LaTeX. La unidad de diseño es el párrafo, regulando los saltos de línea y la presentacíón entre palabras persiguiendo la mejor presentación del bloque. Recordemos que el final de un párrafo se indica mediante una línea en blanco (líneas adicionales no son tenidas en cuenta). El comando par cumple la misma función.

El modo matemático lo utilizamos para la inserción de expresiones matemáticas, como las fórmulas o las ecuaciones. Cuando estamos en él suceden cosas diferentes propias al contexto en el que nos movemos. No hay espacios en blanco, no existen palabras sino que estas se descomponen en sus letras individuales, que ahora se consideran símbolos algebraicos. Como ya sabemos, entramos en el modo matemático con \( o \[ y lo abandonamos con los respectivos \) y \]. Existen también diferentes entornos para esta función.

Pero existe un modo diferente, utilizado también para la inserción de texto, en el que, en oposición al modo vertical normal, sólo hay horizontalidad, escritura de texto de izquierda a derecha que no se partirá verticalmente en líneas. Es el modo LR (Left, Right).

Hay comandos específicos que activan el modo LR y hoy veremos uno de ellos: mbox.

El comando mbox crea una caja con texto en modo LR del tamaño exacto para contener ese texto.

El concepto de caja es esencial porque, para \LaTeX, todo son cajas. Desde cada letra individual, que luego aglutina en estructuras mayores que son las palabras, pasando por las figuras, tablas, ecuaciones, o los mismos párrafos, todo son cajas. Cajas que pueden contener a su vez otras cajas y que luego serán pegadas adecuadamente para su presentación final.

Con el comando mbox creamos una caja horizontal, sin marco, que contiene el texto que hemos facilitado como argumento. La particularidad de esta caja, al estar su contenido en modo LR, es que desconoce lo que es un cambio de línea.

En la presentación final, al no destacar la caja con ningún marco, puede que pase desapercibida al pegarse, como si de un único carácter se tratase, al resto del texto normal.

O puede que no… Observa el resultado del siguiente código al introducir en mbox un texto que excede la anchura del documento:

\documentclass{article}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{parskip}

\begin{document}
Esta es una caja horizontal muy larga: \mbox{En un lugar de La Mancha, 
de cuyo nombre no quiero acordarme, no ha mucho tiempo que vivía...}. 
El resultado es desastroso.
\end{document}

mbox-1

He capturado la página en pequeño, pero se aprecia como el texto no cabe y se pierde pasado el borde derecho.

Hay que ser muy cuidadoso en esto al utilizar mbox, desde luego. Entonces, ¿qué utilidad práctica nos ofrece este comando?

Puede emplearse, por ejemplo, dentro del modo matemático para introducir una caja horizontal de texto. No obstante, en determinados contextos el resultado no sería el deseado. Como veremos en otro artículo, el paquete amsmath proporciona formas más elegantes para tratar con matemáticas y texto.

Un uso muy común del comando mbox es para prevenir que una palabra sea dividida en un cambio de línea.

Observa el siguiente código y su resultado:

\documentclass{article}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{parskip}

\begin{document}
Si eres músico, es importante que, de cuando en cuando, 
acudas al otorrinolaringólogo a revisar tu audición.

Si eres músico, es importante que, de cuando en cuando, 
acudas al \mbox{otorrinolaringólogo} a revisar tu audición.
\end{document}

mbox-2

En la primera frase, \LaTeX, inteligentemente, divide la palabra otorrinolaringólogo, optimizando la presentación del párrafo. En la segunda, al incluir la palabra en una caja horizontal, evitamos su partición. Naturalmente, deberíamos tener un motivo que justifique esta decisión, algo que quizás no se aprecie en el ejemplo elegido.

En el siguiente artículo presentaremos otros comandos para crear cajas más sofisticadas que con mbox. Entre tanto, guárdate muy bien este en tu gran cajón de herramientas \LaTeX. Ocupa poco lugar, como un solo carácter.

Javier Montero Gabarró


LaTeX – El modo LR y mbox


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Índice completo de artículos relacionados con \LaTeX.

Python – Y, finalmente, finally

Objetivo: presentar la cláusula finally en el manejo de excepciones en Python.

Imaginemos, por un momento, que soy un perverso programador que, bajo el aspecto de un aparente dócil y simple programa esconde en él una intención oculta. Supongamos que, aprovechándome del deseo de todo el mundo de disponer de una aplicación que permita calcular la división de dos números enteros, intento colar un sutil mensaje subliminal al ejecutarla:

dividendo = int(input('Introduce el dividendo: '))
divisor = int(input('Introduce el divisor: '))
print('El cociente de la división de ambos números es', dividendo//divisor)
print("Viva el Betis manque pierda")

>>> 
Introduce el dividendo: 10
Introduce el divisor: 2
El cociente de la división de ambos números es 5
Viva el Betis manque pierda 

Impresionante, pero no tanto…

Si por un casual introducimos como divisor un cero, la división no podrá realizarse y el programa abortará, muriendo con él también nuestras oscuras pretensiones:

>>> 
Introduce el dividendo: 10
Introduce el divisor: 0
Traceback (most recent call last):
  File "C:/Python33/pruebas.py", line 3, in <module>
    print('El cociente de la división de ambos números es', dividendo//divisor)
ZeroDivisionError: integer division or modulo by zero

En los artículos anteriores presentamos la captura de excepciones en Python, de modo que tenemos recursos para solucionar esto:

try:
    dividendo = int(input('Introduce el dividendo: '))
    divisor = int(input('Introduce el divisor: '))
    print('El cociente de la división de ambos números es', dividendo//divisor)
except:
    print("No ha podido realizarse la operación")
    
print("Viva el Betis manque pierda")

>>> 
Introduce el dividendo: 10
Introduce el divisor: 0
No ha podido realizarse la operación
Viva el Betis manque pierda

Desde luego, esto funciona. La operación de división ha sido protegida con un try/except que, tal como está planteado, intercepta cualquier excepción que pudiera ocurrir. He introducido en el bloque try las dos sentencias input, no sólo la división, pues también ocurriría una excepción si se facilitase un valor no numérico cuando int() intentara la conversión a entero.

El código no fallará ante una eventual división por cero (ZeroDivisionError), la introducción de letras en vez de números (ValueError), o una interrupción con Ctrl-C (KeyboardInterrupt).

Pero no me convence. Quiero emplear mi propio manejador ante una división por cero o la introducción de letras, pero quiero respetar el gestor por omisión que trae Python (el mensaje de error clásico tras abortar el programa) para poder finalizar la ejecución con Ctrl-C si así lo deseo.

Hemos aprendido a interceptar selectivamente las excepciones también:

try:
    dividendo = int(input('Introduce el dividendo: '))
    divisor = int(input('Introduce el divisor: '))
    print('El cociente de la división de ambos números es', dividendo//divisor)
except (ZeroDivisionError, ValueError):
    print("No ha podido realizarse la operación")
    
print("Viva el Betis manque pierda")

Ahora, si dividimos entre cero, salvamos el error y también nuestro mensaje subliminal:

>>> 
Introduce el dividendo: 10
Introduce el divisor: 0
No ha podido realizarse la operación
Viva el Betis manque pierda

Lo mismo si introducimos valores no numéricos:

>>> 
Introduce el dividendo: GOL!!!
No ha podido realizarse la operación
Viva el Betis manque pierda

Pero nuestro gozo en un pozo si abortamos con Ctrl-C:

>>> 
Introduce el dividendo: 
Traceback (most recent call last):
  File "C:/Python33/pruebas.py", line 2, in <module>
    dividendo = int(input('Introduce el dividendo: '))
KeyboardInterrupt

Se rompe la ejecución del programa y, con ello, el Betis pierde.

Para seguir insuflándole ánimos, Python dispone de la claúsula finally en el bloque try. El código que se incluya en ella, apúntate esto bien, se ejecutará siempre, suceda o no suceda una excepción.

En su versión más simple, finally no necesita que haya ningún except:

try:
    dividendo = int(input('Introduce el dividendo: '))
    divisor = int(input('Introduce el divisor: '))
    print('El cociente de la división de ambos números es', dividendo//divisor)
finally:
    print("Viva el Betis manque pierda")

Ahora, pase lo que pase dentro del try, la instrucción del finally se ejecutará siempre. Tanto si sucede algo bueno:

>>> 
Introduce el dividendo: 10
Introduce el divisor: 2
El cociente de la división de ambos números es 5
Viva el Betis manque pierda

Como si no:

>>> 
Introduce el dividendo: 10
Introduce el divisor: 0
Viva el Betis manque pierda
Traceback (most recent call last):
  File "C:/Python33/pruebas.py", line 4, in <module>
    print('El cociente de la división de ambos números es', dividendo//divisor)
ZeroDivisionError: integer division or modulo by zero

Se ejecuta el print del finally y, a continuación, el manejador por omisión se ocupa del tratamiento de la excepción, abortando el programa e informando por qué.

Podemos combinar finally con except también:

try:
    dividendo = int(input('Introduce el dividendo: '))
    divisor = int(input('Introduce el divisor: '))
    print('El cociente de la división de ambos números es', dividendo//divisor)
except (ZeroDivisionError, ValueError):
    print("No ha podido realizarse la operación")
finally:
    print("Viva el Betis manque pierda")

En este caso utilizamos nuestro propio gestor ante una división por cero o la introducción de valores no numéricos, pero mantenemos el que trae por defecto Python para cualquier otra excepción, lo que nos permite abortar el programa con Ctrl- C. El código dentro de la claúsula finally se ejecuta siempre, suceda o no suceda una excepción:

>>> 
Introduce el dividendo: 10
Introduce el divisor: 4
El cociente de la división de ambos números es 2
Viva el Betis manque pierda
>>> ================================ RESTART ================================
>>> 
Introduce el dividendo: 
Viva el Betis manque pierda
Traceback (most recent call last):
  File "C:/Python33/pruebas.py", line 2, in <module>
    dividendo = int(input('Introduce el dividendo: '))
KeyboardInterrupt

El uso típico de la claúsula finally es la realización de tareas de limpieza para que no queden flecos en caso de que se produzca una excepción. Piensa, por ejemplo, en el gesto de cerrar un fichero una vez ha sido abierto para asegurarnos de que, suceda lo que suceda mientras estemos procesando el fichero, siempre quedará perfectamente cerrado.

Dedicaremos el próximo artículo, a modo de resumen, a esquematizar lo que hemos tratado hasta ahora en estos cuatro artículos dedicados a la gestión de excepciones en Python.

Nota: no soy futbolero, ni tengo preferencia por ningún equipo sobre otro, pero sí que admito un cariño y especial admiración por la afición del Betis, tan incondicional, fiel y estoica.

Javier Montero Gabarró


Python – Y, finalmente, finally


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

Running – Febrero 2014

Dejamos enero tirado en la cuneta ya y proseguimos con los entrenamientos de febrero, mes especial para el running sevillano, que ha acogido en su calendario la trigésima edición (¡30 años!) de su maratón, con records tanto de la prueba (2:08:33, Kiplimo Lagat) como en participación (9000 corredores).

Mes también en el que se abre la inscripción para otros dos eventos típicos del panorama sevillano: Sevilla 10K City Run (que otros años hemos conocido como Divina Pastora), el 9 de marzo, y el circuito de carreras populares del IMD, cuya primera prueba, Nervión – San Pablo, tendrá lugar el día 30 de marzo. Ya estoy inscrito en ambas, de modo que, salvo razones de causa mayor, me espera un mes de marzo entretenido.

Continuemos con los entrenamientos del mes:

2 de febrero de 2014

El domingo es un día perfecto para una tirada larga. Sea lo que sea lo que para uno signifique esto, una vez a la semana hay que estar dispuesto a hacer más kilómetros de lo habitual. Para mí, una tirada larga es aquella que supera los 10 kilómetros, distancia típica de las pruebas en que participo. En ocasiones puntuales la supero entrenando (12, 15, o incluso más de 20 Km), pero ya me he aprendido bien que, si quiero mantener alejado el riesgo de lesión, cuantas menos veces exceda la hora corriendo, tanto más me lo agradecerán mis articulaciones.

El parque de Miraflores está entre mis favoritos del fin de semana. Muchos corredores y muchos kilómetros de circuitos posibles donde el aburrimiento no tiene cabida.

10.21Km; 59:50; 5:52/Km

8 de febrero de 2014

Sesión de trabajo en la cinta, con una pequeña vuelta de tuerca…

[(10, 0, 4), (12.2, 0, 1)] x 6

La terna significa (velocidad en kh/h, inclinación, tiempo en minutos).

Es decir, cuatro minutos a 10Km/h (6:00/Km) y uno a 12.2Km/h (4:52/Km), todo eso seis veces sin descansar. Recordemos que persigo ser capaz, algún día, de correr los 10Km en menos de 50 minutos, es decir, realizar en promedio cada kilómetro en menos de cinco minutos.

18 de febrero de 2014

No hay justificación para tantos días seguidos sin entrenar. El tremendo mal tiempo que hemos estado viviendo estas dos últimas semanas no es excusa suficiente.

Escapada al Huevo de Colón: 9.03Km; 53:29; 5:55/Km.

22 de febrero de 2014

Parque de Miraflores: 10.01 Km; 57:17; 5:43/Km.

24 de febrero de 2014

Ya se perciben los beneficios de los cambios de ritmo en la cinta. Aumento el tiempo que paso corriendo a 12Km/h sin apenas notar un mayor esfuerzo:

[(10, 0, 3:30), (12, 0, 1:30)] x 6

28 de febrero de 2014

Una mañana festiva no puede desaprovecharse, de modo que me calzo las zapatillas y me doy una escapada al río a correr:

7.01Km; 38:28; 05:29/Km

Lo que ha hecho particularemente interesante a este entrenamiento es que, en plena recta y durante un minuto, he soltado las piernas todo lo que he podido, manteniendo un ritmo medio de 4 minutos el kilómetro (15 Km/h). Breve, pero vertiginoso, adelantando incluso a algunos ciclistas. Puedo entender a quienes hablan del placer de correr rápido (nuevamente, esto es relativo).

Nos vemos en marzo.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2014/02/running-febrero-2014/


Puedes consultar el índice completo de artículos pertenecientes a la categoría running.


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta

Armonización de la escala dórica

Objetivo: presentar los acordes tríadas y tétradas que aparecen al armonizar la escala dórica.

Esta vez iremos rápido. En el artículo anterior de esta serie mostramos con todo lujo de detalles los cálculos necesarios para descubrir los acordes que surgían al armonizar la escala menor natural. Y lo hicimos excediéndonos, aplicando dos caminos diferentes que, como pudimos comprobar, conducían al mismo destino. Por un lado nos aprovechamos del hecho de que la escala menor natural no es sino un modo de la escala mayor (el eólico), por lo que sus acordes propios son exactamente los mismos que los de esta última, sólo que ordenados de modo diferente. Por otro, dedujimos las armonías agregando terceras sucesivas y nombrando los acordes resultantes según el tipo de intervalos que nos encontrábamos.

El caso que nos presenta hoy es semejante: la escala dórica es el segundo modo de la escala mayor.

Es decir, si, por ejemplo, Do mayor es:

Do mayor: C – D – E – F – G – A – B

Re dórica no es otra sino la misma comenzando por Re, el segundo grado:

Re dórica: D – E – F – G – A – B – C

La misma relación de orden sucede entre los acordes de ambas:

Armonización de Do mayor en tríadas:

C – Dm – Em – F – G – Am – B°

Armonización de Re dórica en tríadas:

Dm – Em – F – G – Am – B° – C

Armonización de Do mayor en tétradas:

Cmaj7 – Dm7 – Em7 – Fmaj7 – G7 – Am7 – Bm7(b5)

Armonización de Re dórica en tétradas:

Dm7 – Em7 – Fmaj7 – G7 – Am7 – Bm7(b5) – Cmaj7

Si no comprendes de dónde surgen estos acordes, echa un vistazo a los artículos dedicados a la armonización de la escala mayor.

Para expresar estas relaciones en términos generales, debemos recordar la fórmula de la escala dórica:

Escala dórica: 1 – 2 – b3 – 4 – 5 – 6 – b7

Recuerda que es como la escala menor natural, pero con la sexta mayor (6 en lugar de b6).

Uniendo esta fórmula a los acordes que acabamos de descubrir, obtenemos:

Armonización de la escala dórica en tríadas:

Im – IIm – bIII – IV – Vm – VI° – bVII

Armonización de la escala dórica en tétradas:

Im7 – IIm7 – bIIImaj7 – IV7 – Vm7 – VIm7(b5) – bVIImaj7

No debes obsesionarte por memorizar estas relaciones, pues la escala dórica no se armoniza con frecuencia. Lo importante es que recuerdes los mecanismos para calcularlas cuando las necesites. Si ya tienes en tu memoria los acordes propios de la escala mayor, sólo tendrás que escribirlos y volver a tomarlos desde el segundo para obtener los acordes dóricos sin esfuerzo alguno.

La siguiente escala menor que armonizaremos es la armónica. Estate atento, pues nos visitaran acordes no presentes en la armonización mayor (ni, por lo tanto, en ninguno de sus modos), que enriquecerán nuestras opciones a la hora de componer en tonalidades menores.

Javier Montero Gabarró


Armonización de la escala dórica


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Índice completo de artículos sobre armonía.

Python – Sin excepciones, what else?

Objetivo: utilización de la claúsula ELSE en la gestión de excepciones en Python.

En el artículo anterior aprendimos a capturar selectivamente excepciones y escribimos código realmente robusto que realizaba una división entera a prueba de bombas.

El programa era capaz de responder a cualquier excepción fatal. Observa las respuestas personalizadas ante una división por cero o la introducción de un valor no numérico, así como la respuesta genérica ante cualquier otra eventualidad (como el intento de abortar el programa con Ctrl-C).

while True:
    try:
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except ZeroDivisionError:
        print('¡No, no, la división por cero no está permitida')
    except ValueError:
        print('¡Ojo, presta atención e introduce sólo números!')
    except:
        print('No sé qué has hecho, pero vuelve a intentarlo')

Pero ahora voy a plantearte un sencillo ejercicio. Quiero que modifiques el programa de modo que, cada vez que el código se ejecute libre de excepciones, aparezca un mensaje indicándolo.

Obviamente, lo siguiente no sirve:

while True:
    try:
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except ZeroDivisionError:
        print('¡No, no, la división por cero no está permitida')
    except ValueError:
        print('¡Ojo, presta atención e introduce sólo números!')
    except:
        print('No sé qué has hecho, pero vuelve a intentarlo')
    print("Todo ha ido como la seda")

El mensaje aparece en cada iteración, haya o no sucedido una excepción:

>>> 
Introduce el dividendo: 10
Introduce el divisor: 4
El cociente de la división de ambos números es 2
Todo ha ido como la seda
Introduce el dividendo: 10
Introduce el divisor: 0
¡No, no, la división por cero no está permitida
Todo ha ido como la seda
Introduce el dividendo: 

Es un problema fácil de resolver, no obstante. Podemos hacer uso de una variable booleana para alertar de que se ha producido una excepción:

while True:
    try:
        sin_excepciones = True
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except ZeroDivisionError:
        print('¡No, no, la división por cero no está permitida')
        sin_excepciones = False
    except ValueError:
        print('¡Ojo, presta atención e introduce sólo números!')
        sin_excepciones = False
    except:
        print('No sé qué has hecho, pero vuelve a intentarlo')
        sin_excepciones = False
    if sin_excepciones:
        print("Todo ha ido como la seda")

Eso es lo que haríamos en otros lenguajes como Java o C++ (pero no en C, que ni siquiera maneja excepciones). Como vemos, ahora el mensaje aparece exclusivamente sólo si el código ha transcurrido libre de tropiezos:

>>> 
Introduce el dividendo: 10
Introduce el divisor: 0
¡No, no, la división por cero no está permitida
Introduce el dividendo: 10
Introduce el divisor: 4
El cociente de la división de ambos números es 2
Todo ha ido como la seda
Introduce el dividendo: 

Pero esto no es Java ni C++, sino Python…

La sentencia TRY admite una claúsula ELSE para introducir en ella el código que queremos que se ejecute siempre y cuando no haya sucedido ninguna excepción.

while True:
    try:
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except ZeroDivisionError:
        print('¡No, no, la división por cero no está permitida')
    except ValueError:
        print('¡Ojo, presta atención e introduce sólo números!')
    except:
        print('No sé qué has hecho, pero vuelve a intentarlo')
    else:
        print("Todo ha ido como la seda")

Y ahora sí…

>>> 
Introduce el dividendo: 10
Introduce el divisor: 0
¡No, no, la división por cero no está permitida
Introduce el dividendo: 10
Introduce el divisor: 4
El cociente de la división de ambos números es 2
Todo ha ido como la seda
Introduce el dividendo: 

Así de sencillo.

Seguro que George Clooney diría, si supiera programar: Python, what else?

Javier Montero Gabarró


Python – Sin excepciones, what else?


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

Armonización de la escala menor natural

Objetivo: deducir los acordes que aparecen al armonizar la escala menor natural.

En el artículo de hoy armonizaremos la primera de las escalas menores por excelencia, la menor natural. Es decir, sobre cada grado de la escala apilaremos terceras sucesivas hasta construir acordes de tres y cuatro notas (tríadas y tétradas, respectivamente). Es exactamente lo mismo que hicimos cuando armonizamos la escala mayor.

Deduciremos los acordes de dos formas diferentes. En la primera, casi inmediata, aprovecharemos el hecho de que la escala menor natural no es sino un modo de la escala mayor (el modo eólico). Esto nos ahorrará tener que repetir los cálculos que en su día hicimos con la escala mayor. En la segunda realizaremos el trabajo a mano, agregando cada tercera y poniendo nombre a los acordes resultantes. Todo músico debe estar perfectamente familiarizado con este tipo de cálculos.

Comencemos recordando la formación del modo eólico.

Tomemos como referencia cualquier escala mayor; sin ir más lejos, por su obvia sencillez, DO mayor.

DO mayor: C – D – E – F – G – A – B

El modo eólico se obtiene partiendo del sexto grado utilizando las mismas notas. En nuestro ejemplo, el sexto grado es LA (A). Si construimos, con las mismas notas, la escala que comienza a partir de LA, obtenemos el modo eólico o escala menor natural:

LA eólica (menor natural): A – B – C – D – E – F – G

Conclusión que nos permitía calcular su fórmula relativa:

Eólica (menor natural): 1 – 2 – b3 – 4 – 5 – b6 – b7

De igual modo, si al armonizar DO mayor obteníamos

Armonización DO mayor (tríadas):
C – Dm – Em – F – G – Am – B°

Armonización DO mayor (tétradas):
Cmaj7 – Dm7 – Em7 – Fmaj7 – G7 – Am7 – Bm7(b5)

Comenzando por el sexto acorde (nota fundamental LA) obtendremos la armonización de LA eólica (LA menor natural):

Armonización LA menor natural (tríadas):
Am – B° – C – Dm – Em – F – G

Armonización LA menor natural (tétradas):
Am7 – Bm7(b5) – Cmaj7 – Dm7 – Em7 – Fmaj7 – G7

O bien, en términos generales, basándonos en la fórmula relativa de la escala menor natural:

Armonización de la escala menor natural (tríadas):
Im – II° – bIII – IVm – Vm – bVI – bVII

Armonización de la escala menor natural (tétradas):
Im7 – IIm7(b5) – bIIImaj7 – IVm7 – Vm7 – bVImaj7 – bVII7

A lo que quiero llegar con este desarrollo es que observes lo fácil que resulta recuperar estos acordes si los olvidas pero, en cambio, recuerdas los que aparecen al armonizar la escala mayor. Es cuestión de coger exactamente los mismos, pero comenzando en un punto diferente.

Repetiremos esta operación ahora, a modo de ejercicio, por el procedimiento habitual para armonizar escalas heptatónicas que ya empleamos sobre la escala mayor.

Partimos de la fórmula de la escala menor natural y la elaboramos sobre DO:

DO menor natural: C – D – Eb – F – G – Ab – Bb

Construyamos los acordes que aparecen al apilar terceras sobre cada grado.

Contar terceras es contar 1-2-3 sobre las notas de esa escala, incluyendo el punto de origen en la cuenta. Así, por ejemplo, en nuestra escala menor natural, una tercera sobre DO es MI bemol, sobre SOL es SI bemol, y sobre LA bemol es DO.

Empecemos por las tríadas:

Acorde sobre el primer grado: C – Eb – G
Acorde sobre el segundo grado: D – F – Ab
Acorde sobre el tercer grado: Eb – G – Bb
Acorde sobre el cuarto grado: F – Ab – C
Acorde sobre el quinto grado: G – Bb – D
Acorde sobre el sexto grado: Ab – C – Eb
Acorde sobre el séptimo grado: Bb – D – F

Date cuenta que, entre esas terceras, algunas son mayores (4 semitonos de distancia) y otras menores (tres semitonos). En función de cómo estén apiladas el acorde se denominará de un modo u otro.

Recordemos esto:

Tercera mayor + Tercera menor: Tríada mayor
Tercera menor + Tercera mayor: Tríada menor
Tercera menor + Tercera menor: Tríada disminuida
Tercera mayor + Tercera mayor: Tríada aumentada

Sólo hay que calcular intervalos:

C – Eb – G: 3 semitonos + 4 semitonos: Tercera menor + Tercera mayor: DO menor
D – F – Ab: Tercera menor + Tercera menor: RE disminuido
Eb – G – Bb: Tercera mayor + Tercera menor: MI bemol mayor
F – Ab – C: Tercera menor + Tercera mayor: FA menor
G – Bb – D: Tercera menor + Tercera mayor: SOL menor
Ab – C – Eb: Tercera mayor + Tercera menor: LA bemol mayor
Bb – D – F: Tercera mayor + Tercera menor: SI bemol mayor

He aquí, recopiladas, las tríadas resultantes:

Cm – D° – Eb – Fm – Gm – Ab – Bb

En términos generales, sobre cualquier tónica:

Im – II° – bIII – IVm – Vm – bVI – bVII

Resultado que coincide con el deducido más arriba.

También podríamos haber estudiado la composición de cada acorde comparando directamente cada grado obtenido con la fundamental. La primera tercera está a una tercera de la fundamental; la siguiente, a una quinta de esta.

Tercera mayor (4 semitonos) y Quinta justa (7 semitonos): Tríada mayor
Tercera menor (3 semitonos) y Quinta justa: Tríada menor
Tercera mayor y Quinta aumentada (8 semitonos): Tríada aumentada
Tercera menor y Quinta disminuida (6 semitonos): Tríada disminuida

El resultado habría sido el mismo (compruébalo si no has hecho este tipo de cálculos antes). Todas las quintas que aparecen son justas, a excepción de la que sucede sobre el segundo grado, que es disminuida.

Para calcular la versión tétrada de estos acordes apilaremos una tercera más sobre cada tríada obtenida:

Acorde sobre el primer grado: C – Eb – G – Bb
Acorde sobre el segundo grado: D – F – Ab – C
Acorde sobre el tercer grado: Eb – G – Bb – D
Acorde sobre el cuarto grado: F – Ab – C – Eb
Acorde sobre el quinto grado: G – Bb – D – F
Acorde sobre el sexto grado: Ab – C – E – G
Acorde sobre el séptimo grado: Bb – D – F – Ab

La mejor manera de poner nombre a estos acordes pasa por descubrir la naturaleza del último grado añadido. Si te das cuenta, al apilar sobre la fundamental en tríadas hemos obtenido: fundamental + tercera + quinta. El nuevo grado, a una tercera de la quinta, es la séptima del acorde.

Hay que empezar, entonces, averiguando qué tipo de séptima es. Recordemos los tres tipos de séptimas:

Séptima mayor: a 11 semitonos de la fundamental.
Séptima menor: a 10 semitonos de la fundamental
Séptima disminuida: a 9 semitonos de la fundamental

Podemos contar semitonos desde la fundamental de cada acorde. Pero más sencillo es hacerlo al revés, contando la distancia que separa la séptima con la siguiente aparición de la fundamental, la octava. Ambas distancias deben sumar doce.

La tabla anterior puede, entonces, expresarse del siguiente modo:

Séptima mayor: a un semitono de la octava (12 - 11 = 1)
Séptima menor: a dos semitonos de la octava (12 - 10 = 2)
Séptima disminuida: a tres semitonos de la octava (12 - 9 = 3).

Los acordes tétradas se denominan dependiendo de cúal sea la tríada base y la séptima agregada:

Tríada mayor y Séptima mayor: Acorde de séptima mayor: maj7
Tríada mayor y Séptima menor: Acorde de séptima: 7
Tríada menor y Séptima mayor: Acorde menor con séptima mayor: m(maj7)
Tríada menor y Séptima menor: Acorde menor séptima: m7
Tríada disminuida y Séptima menor: Acorde menor séptima b5 o semidisminuido: m7(b5)
Tríada disminuida y Séptima disminuida: Acorde de séptima disminuido: dim7
Tríada aumentada y Séptima mayor: Acorde aumentado con séptima mayor: +maj7
Tríada aumentada y Séptima menor: Acorde aumentado séptima: +7

Apréndete bien esta tabla; te ayudará a comprender de verdad lo que hay detrás de la construcción de acordes.

No todos estos tipos nos aparecerán ahora al armonizar la escala menor natural. Entrarán en escena, a su debido momento, cuando le metamos mano a otras escalas menores como la melódica o la armónica.

Volvamos a nuestras recién creadas tétradas y apliquemos lo expuesto arriba:

C – Eb – G – Bb: Tríada menor y Séptima menor (Bb está a dos semitonos de C): Cm7
D – F – Ab – C: Tríada disminuido y Séptima menor: Dm7(b5)
Eb – G – Bb – D: Tríada mayor y Séptima mayor (D está a un semitono de Eb): Ebmaj7
F – Ab – C – Eb: Tríada menor y Séptima menor: Fm7
G – Bb – D – F: Tríada menor y Séptima menor: Gm7
Ab – C – E – G: Tríada mayor y Séptima mayor: Abmaj7
Bb – D – F – Ab: Tríada mayor y Séptima menor: Bb7

Obteniendo así la armonización de DO menor natural:

Cm7 – Dm7(b5) – Ebmaj7 – Fm7 – Gm7 – Abmaj7 – Bb7

Generalizando a cualquier tónica:

Im7 – IIm7(b5) – bIIImaj7 – IVm7 – Vm7 – bVImaj7 – bVII7

Tal como obtuvimos empleando la primera metodología.

Es importante que te tomes tu tiempo en asimilar y practicar las técnicas que hemos expuesto hoy. Si algo no está del todo claro, asegúrate de que conoces bien otros conceptos como la nomenclatura de intervalos, la formación de escalas y la construcción de acordes. Todos estos temas han sido tratados ya en este blog con anterioridad.

Continuaremos esta serie armonizando otras escalas menores que aún nos quedan en el tintero, pero, ¿por qué no intentarlo tú mismo? Te he mostrado las técnicas y el material de referencia suficiente para poder hacerlo por tu cuenta. Demuéstrate que ya no me necesitas y aventúrate sin miedo. Los fantasmas no son tales cuando se les ilumina.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2014/01/armonizacion-de-la-escala-menor-natural/


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Índice completo de artículos sobre armonía.

Python – Captura selectiva de excepciones

Objetivo: mostrar cómo capturar selectivamente las excepciones en Python dependiendo de su tipo.

En el artículo anterior introdujimos el concepto de excepción en Python y aprendimos a proteger a prueba de bombas un determinado bloque de código utilizando la estructura try/except. El bloque a proteger lo recogíamos en la sección try y, si algo inesperado (una excepción) ocurría dentro de él, las instrucciones contenidas en la sección except se ocupaban de su tratamiento.

Recuperemos nuestra robusta división entera:

while True:
    try:
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except:
        print('Eso no ha estado bien, pero no pasa nada')
        print('Vuelve a intentarlo')

Si y sólo si sucede una excepción dentro de la sección try, el bloque de la sección except será ejecutado.

En particular, el código está vacunado ante excepciones como, por ejemplo:

ZeroDivisionError: si introducimos un cero como divisor, la división dejará de existir.

ValueError: si en lugar de introducir números escribimos caracteres, la función int() no podrá realizar la conversión.

KeyboardInterrupt: si tecleamos Ctrl-C el programa será abortado.

Pero, ¿y si queremos controlar la captura de excepciones de un modo más selectivo? Por ejemplo, ¿cómo haríamos si sólo queremos dejar protegido el código ante un eventual ZeroDivisionError?

Basta con especificar el tipo de excepción en la claúsula except. Veámoslo:

while True:
    try:
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except ZeroDivisionError:
        print('Eso no ha estado bien, pero no pasa nada')
        print('Vuelve a intentarlo')

>>> 
Introduce el dividendo: 10
Introduce el divisor: 0
Eso no ha estado bien, pero no pasa nada
Vuelve a intentarlo
Introduce el dividendo: 
Traceback (most recent call last):
  File "C:/Users/javier/Desktop/borrable.py", line 3, in <module>
    dividendo = int(input('Introduce el dividendo: '))
KeyboardInterrupt

Como vemos, la excepción ZeroDivisionError ha sido capturada, pero no KeyboardInterrupt, ocasionada al teclear Ctrl-C con la intención de terminar la ejecución del programa.

Vayamos un paso más adelante. Escribamos ahora código que proteja no sólo de ZeroDivisionError, sino también de ValueError. Para ello, es suficiente con introducir ambas excepciones, separadas con una coma y entre paréntesis junto a la palabra except:

while True:
    try:
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except (ZeroDivisionError, ValueError):
        print('Eso no ha estado bien, pero no pasa nada')
        print('Vuelve a intentarlo')

Comprobémoslo:

>>> 
Introduce el dividendo: 12
Introduce el divisor: 0
Eso no ha estado bien, pero no pasa nada
Vuelve a intentarlo
Introduce el dividendo: 12
Introduce el divisor: abcde
Eso no ha estado bien, pero no pasa nada
Vuelve a intentarlo
Introduce el dividendo: 12
Introduce el divisor: 4
El cociente de la división de ambos números es 3
Introduce el dividendo: 
Traceback (most recent call last):
  File "C:/Users/javier/Desktop/borrable.py", line 3, in <module>
    dividendo = int(input('Introduce el dividendo: '))
KeyboardInterrupt

Ctrl-C ha podido interrumpir el programa, pero no la división por cero ni el uso de letras en lugar de números.

El código siguiente ejecutará un tratamiento diferente según la excepción que se produzca. Observa el uso de varias claúsulas except:


while True:
    try:
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except ZeroDivisionError:
        print('¡No, no, la división por cero no está permitida!')
    except ValueError:
        print('¡Ojo, presta atención e introduce sólo números!')

No sólo hemos capturado selectivamente las excepciones ZeroDivisionError y ValueError, sino que, además, el programa responderá de modo distinto según cuál suceda. Obsérvalo:

>>> 
Introduce el dividendo: 10
Introduce el divisor: 0
¡No, no, la división por cero no está permitida!
Introduce el dividendo: 10
Introduce el divisor: abcde
¡Ojo, presta atención e introduce sólo números!
Introduce el dividendo: 
Traceback (most recent call last):
  File "C:/Users/javier/Desktop/borrable.py", line 3, in <module>
    dividendo = int(input('Introduce el dividendo: '))
KeyboardInterrupt

Hemos salido del bucle infinito pulsando Ctrl-C, pues KeyboardInterrupt no ha sido capturada.

Naturalmente, puedes incluir tantos except personalizados como excepciones desees tratar.

Aún podemos rizar el rizo…

Imagina que, además de lo que hemos hecho en el ejemplo anterior, en el que hemos capturado y tratado de modo diferente dos excepciones, queremos programar una respuesta general para cualquier otra excepción. Agregamos, simplemente, una nueva claúsula except genérica que no incluya ningún nombre de excepción:

while True:
    try:
        dividendo = int(input('Introduce el dividendo: '))
        divisor = int(input('Introduce el divisor: '))
        print('El cociente de la división de ambos números es', dividendo//divisor)
    except ZeroDivisionError:
        print('¡No, no, la división por cero no está permitida')
    except ValueError:
        print('¡Ojo, presta atención e introduce sólo números!')
    except:
        print('No sé qué has hecho, pero vuelve a intentarlo')

Y ahora:

>>> 
Introduce el dividendo: 10
Introduce el divisor: 0
¡No, no, la división por cero no está permitida
Introduce el dividendo: 10
Introduce el divisor: abcde
¡Ojo, presta atención e introduce sólo números!
Introduce el dividendo: 10
Introduce el divisor: 
No sé qué has hecho, pero vuelve a intentarlo
Introduce el dividendo: 

En el tercer intento hemos pulsado Ctrl-C, por eso aparece el mensaje que hemos reservado para otras excepciones.

El tratamiento genérico debe figurar siempre en último lugar, después de los especializados. De lo contrario, el programa devolverá un error sintáctico al tratar de ejecutarlo. Y me temo que ese tipo de errores no hay try/except que los capture.

Esto se ha puesto interesante, pero aún hay mucho más que decir sobre el tratamiento de excepciones. Permanece atento…

Javier Montero Gabarró


Python – Captura selectiva de excepciones


El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)


El Club del Autodidacta


Consulta el índice completo de artículos relacionados con Python.

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies