Construcción de acordes – 19: Séptima con novena menor

Objetivo: presentar la fórmula relativa del acorde de séptima con novena menor.

De la misma familia de acordes alterados a la que pertenece el acorde de la entrega anterior, séptima con novena aumentada, nos encontramos ahora con su otra variante, disminuyendo la novena un semitono y haciéndola, por lo tanto, menor: séptima con novena menor.

Recopilemos las variantes del acorde de séptima con novena:

7(9) --> Séptima con novena: 1 - 3 - 5 - b7 - 9
(cuando no se especifica el tipo de novena se sobreentiende mayor)

7(#9) --> Séptima con novena aumentada: 1 - 3 - 5 - b7 - #9

Lista a la que agregamos el acorde de hoy:

7(b9) --> Séptima con novena menor --> 1 - 3 - 5 - b7 - b9

Un acorde con un sonido inconfundible que recomiendo incluyas en tu repertorio.

Resulta estremecedor escucharlo en Corcovado, de Tom Jobim, procedente de un acorde de un 7sus4(9) (manteniendo fundamental y séptima y disminuyendo un semitono las demás).

En Una y otra vez, una de mis composiciones para Viciosfera, recurro a él en la Intro a modo de ostinato:

| Am7 E7(b9) | Am7 E7(b9) | Am7 E7(b9) | Am7 E7(b9) |

Como siempre, los dos ejercicios prácticos: calculemos las notas de C7(b9) y A7(b9).

Las escalas mayores respectivas, construidas a partir de la fundamental de cada acorde, son:

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

La mayor: A - B - C# - D - E - F# - G# - A - B

Tomando los grados indicados en la fórmula, obtenemos:

C7(b9) --> C - E - G - Bb - Db

A7(b9) --> A - C# - E - G - Bb

Y eso es todo. Recuerda que aquí tienes un índice con todos los acordes que han aparecido en esta serie.

Javier Montero Gabarró


Construcción de acordes – 19: Séptima con novena menor


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 de todos los artículos de armonía.

Python: Recorriendo un diccionario de principio a fin

Objetivo: aprender a recorrer con un bucle for las claves, los valores o ambos de un diccionario en Python.

En numerosas ocasiones necesitaremos iterar a través de un diccionario mediante un bucle for. Voy a mostrarte lo sencillo que es y, para eso, te presentaré tres nuevos métodos que debes incorporar en tu kit de herramientas. Si has aterrizado en este artículo de modo casual y es la primera vez que te expones a los diccionarios en Python, te recomiendo que consultes el índice que figura en el menú o al final del artículo y estudies los artículos previos, que introducen los diccionarios desde cero.

Echa las manos al intérprete interactivo y genera un diccionario de pruebas:

>>> macedonia = {'plátano':'amarillo', 'fresa':'roja'}

Imagina que quieres trabajar con las claves de ese diccionario. ¿Cómo las obtenemos?

Empleando el método keys():

>>> frutas = macedonia.keys()
>>> frutas
dict_keys(['fresa', 'plátano'])

Si observas frutas, encontrarás las claves del diccionario, pero se trata de un objeto especial, claves de diccionario. Deja que te lo explique:

Lo que has obtenido es una vista del diccionario. Es como si observaras un objeto, el diccionario, desde una perspectiva diferente que sólo te permitiera apreciar determinadas características.

Hay dos cosas particularmente importantes en las vistas.

La primera es que lo que estás viendo a través de ellas es el objeto real. Si modificamos el diccionario, la vista se actualizará dinámicamente. Obśervalo.

Vamos a agregar un nuevo par clave-valor al diccionario y veamos qué sucede con la vista:

>>> macedonia['manzana'] = 'verde'
>>> macedonia
{'fresa': 'roja', 'plátano': 'amarillo', 'manzana': 'verde'}

¿Qué crees que contendrá ahora la vista frutas?

>>> frutas
dict_keys(['fresa', 'plátano', 'manzana'])

Como ves, se ha actualizado automáticamente sin necesidad de volvera a invocar al método?

La segunda particularidad de las vistas es que ya están preparadas para que puedas iterar sobre ellas:

>>> for fruta in frutas:
  print(fruta)

  
fresa
plátano
manzana

Tras lo cual hemos recuperado todas las claves del diccionario.

Si queremos iterar sobre los valores, en lugar de las claves, disponemos de otro método que genera una nueva vista:

>>> colores = macedonia.values()
>>> colores
dict_values(['roja', 'amarillo', 'verde'])

El método values() nos genera una vista sólo de valores sobre la que ya podemos iterar:

>>> for color in colores:
  print(color)

  
roja
amarillo
verde

Finalmente, ¿y si necesitamos iterar sobre las claves y sus correspondientes valores simultáneamente? La respuesta la encontrarás en el método items():

>>> elementos = macedonia.items()
>>> elementos
dict_items([('fresa', 'roja'), ('plátano', 'amarillo'), ('manzana', 'verde')])

Fíjate cómo iteramos ahora:

>>> for fruta, color in elementos:
  print(fruta, '-->', color)

  
fresa --> roja
plátano --> amarillo
manzana --> verde

Obviamente, no es necesaria la asignación previa de la vista. Tambień podrías haber escrito directamente esto:

>>> for fruta, color in macedonia.items():
  print(fruta, '-->', color)

Recuerda: las tres vistas son dinámicas y reflejan la situación actual del objeto.

Vamos a eliminar la fresa de la macedonia:

>>> del macedonia['fresa']
>>> macedonia
{'plátano': 'amarillo', 'manzana': 'verde'}

Y comprobemos nuestras preciosas vistas:

>>> macedonia
{'plátano': 'amarillo', 'manzana': 'verde'}
>>> frutas
dict_keys(['plátano', 'manzana'])
>>> colores
dict_values(['amarillo', 'verde'])
>>> elementos
dict_items([('plátano', 'amarillo'), ('manzana', 'verde')])

Pero, aunque el resultado sea el esperado, coincidirás conmigo que una macedonia sin fresas no es macedonia ni nada…

Javier Montero Gabarró


Python: Recorriendo un diccionario de principio a fin


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.

Introducción a los modos de la escala mayor

Objetivo: presentar y comprender los distintos modos que se construyen a partir de la escala mayor.

¿Te suena a chino si te hablan de términos como la escala locria, la dórica o el modo eólico? ¿Sabrías tocar la escala Sol frigia, o Si bemol lidia en tu instrumento?

Si eres músico o aspiras a serlo (tú decides, y nadie más, si ya lo eres o no) y te parecen misteriosos estos conceptos, tienes la obligación moral de seguir leyendo.

Voy a comenzar escribiendo una escala que sin duda conocerás: Do mayor.

DO – RE – MI – FA – SOL – LA – SI – DO

Sabes hasta entonarla.

La estructura de cada tipo de escala está caracterizada por la distancia que existe entre sus notas. En el ejemplo particular de la escala mayor está distancia queda reflejada por su fórmula absoluta:

T – T – S – T – T – T – S

No dejes de leer el artículo denominado La fórmula secreta de la escala mayor si no comprendes su significado.

Pues bien: toma la escala de Do mayor y, empleando las mismas notas, forma la escala que comienza y acaba en su segundo grado, RE:

RE – MI – FA – SOL – LA – SI – DO – RE

Aunque tiene las mismas notas que Do mayor, se trata de una escala completamente diferente, como puedes comprobar si calculas la distancia en semitonos entre cada grado. Echa tú mismo las cuentas y llegarás a una nueva fórmula absoluta:

T – S – T – T – T – S – T

Con un poco de astucia, también podrías haber llegado a esta conclusión sin necesidad de volver a contar, simplemente tomando la fórmula absoluta de la escala mayor comenzándola a partir del segundo grado.

En cualquier caso, observa que se trata de una escala con una estructura diferente.

A esta nueva escala, que hemos obtenido a partir del segundo grado de la escala de Do mayor, RE, la denominamos el modo dórico de RE, o simplemente escala RE Dórica.

Construyamos ahora la escala que comienza y termina en el tercer grado:

MI – FA – SOL – LA – SI – DO – RE – MI

Se trata del modo frigio de MI, o escala MI Frigia.

Construyendo la escala a partir del cuarto grado, FA, obtenemos el modo lidio de FA, o escala FA Lidia:

FA – SOL – LA – SI – DO – RE – MI – FA

Sobre el quinto grado, SOL, construimos el modo mixolidio de SOL, o escala SOL Mixolidia:

SOL – LA – SI – DO – RE – MI – FA – SOL

Sobre el sexto grado, LA, nos encontramos el modo eólico de LA, o escala LA Eólica:

LA – SI – DO – RE – MI – FA – SOL – LA

El modo eólico también recibe otro nombre. ¿Te suena?: Escala menor natural.

Finalmente, sobre el séptimo grado, SI, construimos el modo locrio, o escala SI Locria:

SI – DO – RE – MI – FA – SOL – LA – SI

La escala mayor, tal cual, también tiene nombre de modo: jónico. La escala Do Jónica es la misma que Do mayor.

No voy a hablar aquí de la historia asociada a esta terminología; escribe «modos griegos» en Google si tienes interés en el tema.

Recopilemos la esencia de lo que hemos presentado hasta el momento:

Los modos de la escala mayor

Sobre el PRIMER grado --> Escala JÓNICA (escala mayor)

Sobre el SEGUNDO grado --> Escala DÓRICA

Sobre el TERCER grado --> Escala FRIGIA

Sobre el CUARTO grado --> Escala LIDIA

Sobre el QUINTO grado --> Escala MIXOLIDIA

Sobre el SEXTO grado --> Escala EÓLICA (es la escala menor natural)

Sobre el SÉPTIMO grado --> Escala LOCRIA

Una vez comprendidos los conceptos tú siguiente labor ha de ser memorizar esta tabla; no te supondrá excesivo esfuerzo.

Naturalmente, podemos construir estos mismos modos sobre cualquier escala mayor, no necesariamente sobre DO mayor.

Por ejemplo, considera la escala de FA mayor, que esta vez, como variación, escribiré con notación anglosajona:

F – G – A – Bb – C – D – E – F

Comenzando esta escala por sus sucesivos grados obtenemos los distintos modos:

Fa Jónica --> F - G - A - Bb - C - D - E - F (Fa mayor)

Sol Dórica --> G - A - Bb - C - D - E - F - G

La Frigia --> A - Bb - C - D - E - F - G - A

Si bemol Lidia --> Bb - C - D - E - F - G - A - Bb

Do Mixolidia --> C - D - E - F - G - A - Bb - C

Re Eólica --> D - E - F - G - A - Bb - C - D (Re menor natural)

Mi Locria --> E - F - G - A - Bb - C - D - E

Con esto ya es suficiente, de momento. Afianza los conceptos realizando esta última actividad sobre otras escalas mayores e intenta memorizar el grado asociado a cada modo cuanto antes. En las sucesivas entregas presentaré algunos ejercicios algo más complejos que te ayudarán a dominar este tema.

Javier Montero Gabarró


Introducción a los modos de la escala mayor


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.

MySQL: Modificando los datos de una tabla

Objetivo: aprender lo fundamental para poder modificar datos en tablas MySQL.

Llevo toda la mañana con el gusanillo de escribir algo sobre MySQL y estaba deseando llegar a casa para ponerme a hacerlo. No suelo decidir con antelación a qué dedicaré el siguiente artículo del blog hasta el mismo día en que he de escribirlo. Mis motivaciones pueden ser diferentes: últimamente he escrito bastante sobre Python porque estoy desarrollando mis propias herramientas de productividad empleando ese lenguaje y me resulta mucho más cómodo no desconectar y seguir con lo mismo que dar un brusco requiebro (la programación es como el ajedrez y las matemáticas: monopoliza tu atención y energía); otras veces tomo en consideración los comentarios que me hacen llegar los que me leen (particularmente de modo habitual) e intento ayudarlos preferentemente; y, desde luego, también está el remordimiento, que por ejemplo me está martirizando recordándome que llevo varios meses sin decir ni pío sobre Knoppix (entre otros temas).

Sea lo que sea, es el momento de aplicar una nueva mano de pintura sobre MySQL.

Si echas un vistazo al índice general de artículos dedicados al tema (los más recientes son los de arriba) verás qué ya sabemos hacer bastantes cosas: crear tablas, rellenarlas, agregar nuevos datos, eliminarlos… Hoy veremos cómo cambiar datos ya existentes.

Tomemos una tabla de ejemplo, como esta que me he encontrado de artículos anteriores:

mysql> select * from consumibles;
+------------+---------------------+-------+
| referencia | impresora           | stock |
+------------+---------------------+-------+
| ACME2598X  | ACME INKJET Ultra   |     5 |
| ACME4501Y  | ACME PseudoJET Plus |    12 |
+------------+---------------------+-------+
2 rows in set (0.00 sec)

Se trata de una sencilla tabla para mantener el stock de consumibles de impresión. Agregaremos algunas filas para tener más juego, a la vez que nos servirá para repasar conceptos:

mysql> INSERT INTO consumibles VALUES
    -> ('WG31', 'WALNUT InkJetPrad', 2);
Query OK, 1 row affected (0.13 sec)

mysql> INSERT INTO consumibles VALUES
    -> ('WG40', 'WALNUT LaserGROVE', 10);
Query OK, 1 row affected (0.06 sec)

Tras lo cual consumibles ofrece el siguiente aspecto:

mysql> SELECT * FROM consumibles;
+------------+---------------------+-------+
| referencia | impresora           | stock |
+------------+---------------------+-------+
| ACME2598X  | ACME INKJET Ultra   |     5 |
| ACME4501Y  | ACME PseudoJET Plus |    12 |
| WG31       | WALNUT InkJetPrad   |     2 |
| WG40       | WALNUT LaserGROVE   |    10 |
+------------+---------------------+-------+

Imagina a continuación que colocamos un tóner de la LaserGROVE y otro de la PseudoJET, disminuyendo su stock en una unidad. ¿Cómo reflejaríamos estos cambios en la tabla de consumibles?

Comencemos por la LaserGROVE. Presta mucha atención al siguiente comando:

mysql> UPDATE consumibles SET stock = 9
    -> WHERE referencia = 'WG40';
Query OK, 1 row affected (0.07 sec)
Rows matched: 1  Changed: 1  Warnings: 0

El comando es UPDATE, seguido del nombre de la tabla. A continuación, con SET, indicamos la columna o columnas que queremos modificar, junto con su valor. La claúsula WHERE, que ya conociste en el artículo dedicado a cómo eliminar registros, nos sirve para indicar en qué filas realizaremos los cambios.

Has de ser muy cuidadoso con WHERE, pues, tal como está escrito el comando, se actualizarán todas las filas que cumplan la condición del filtro. En caso de duda, no hubiese estado de más comprobar mediante un SELECT cuál sería el ámbito de actuación antes de realizar la modificación:

mysql> SELECT * FROM consumibles WHERE referencia = 'WG40';
+------------+-------------------+-------+
| referencia | impresora         | stock |
+------------+-------------------+-------+
| WG40       | WALNUT LaserGROVE |    10 |
+------------+-------------------+-------+
1 row in set (0.00 sec)

Como puedes observar, sólo aparece la fila sobre la que queremos actuar.

Fíjate cómo queda la tabla consumibles tras la actualización del stock de la LaserGrove:

mysql> Smysql> SELECT * FROM consumibles;
+------------+---------------------+-------+
| referencia | impresora           | stock |
+------------+---------------------+-------+
| ACME2598X  | ACME INKJET Ultra   |     5 |
| ACME4501Y  | ACME PseudoJET Plus |    12 |
| WG31       | WALNUT InkJetPrad   |     2 |
| WG40       | WALNUT LaserGROVE   |     9 |
+------------+---------------------+-------+
4 rows in set (0.00 sec)

Podríamos emplear un comando similar para actualizar el stock de la PseudoJET, pero prefiero mostrarte una nueva técnica:

mysql> UPDATE consumibles SET stock = stock - 1
    -> WHERE referencia = 'ACME4501Y';
Query OK, 1 row affected (0.15 sec)
Rows matched: 1  Changed: 1  Warnings: 0

En lugar de indicar directamente el contenido del campo stock hemos utilizado una expresión aritmética que se ocupa de decrementar en una unidad su valor.

Creo que es suficiente por hoy: las unidades de información han de ser pequeñas pero significativas, de modo que no se deje de percibir sensación de avance tras su estudio.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2012/08/mysql-modificando-los-datos-de-una-tabla/


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


¡Accede al índice con todos los artículos sobre MySQL!

Python – Consultando los valores de un diccionario

Objetivo: aprender diversas técnicas para consultar los valores de un diccionario en Python.

En esta tercera entrega dedicada a los diccionarios mostraremos cómo consultar los valores que contienen. Ya sabemos agregar o eliminar elementos (pares clave-valor), pero, ¿cómo realizamos consultas específicas?

El diccionario con el que trabajaremos hoy contiene información sobre unos personajes muy peculiares…

>>> gente = {'Pipi':'Calzaslargas', 'Bob':'Esponja',
   'Laura':'Ingalls', 'Sherlock':'Holmes'}

Comencemos determinando si nuestro diccionario contiene una clave concreta:

>>> 'Sherlock' in gente
True
>>> 'Dan' in gente
False

Hemos utilizado el operador in, un viejo conocido ya, para determinar la pertenencia. Podemos chequear, a su vez, la no pertenencia:

>>> 'Dan' not in gente
True

Es importante comprender que este uso sólo comprueba claves, pero no los valores correspondientes, como puedes apreciar en la siguiente instrucción:

>>> 'Esponja' in gente
False

En un próximo artículo aprenderemos métodos que nos permitirán obtener secuencias con las claves, los valores o con ambos, pero primero has de asegurarte de interiorizar bien esto.

Ya sabemos si una clave existe en un diccionario. Nuestra siguiente pregunta es: ¿cómo conocemos el valor que tiene asociado?

La forma más simple de extraer el valor de una determinada clave es utilizar la sintaxis siguiente:

diccionario[clave]

Consultemos qué valor tiene asignado la clave ‘Laura’:

>>> gente['Laura']
'Ingalls'

Si tratamos de consultar el valor de una clave inexistente tendríamos un serio problema:

>>> gente['Pedro']
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    gente['Pedro']
KeyError: 'Pedro'

Se produce un error y el programa se aborta. Más adelante, cuanto tratemos las excepciones, veremos el modo general que provee Python para controlar este tipo de errores, pero ahora veremos técnicas asociadas a los diccionarios para resolver este problema concreto.

Una forma obvia de gestionar este fallo sería realizar una comprobación de pertenencia antes de tratar de consultar el valor:

>>> if 'Pedro' in gente:
  print(gente['Pedro'])
else:
  print('Esta clave no existe')

  
Esta clave no existe

Pero disponemos de una manera más elegante. Deja que te presente el método get().

>>> gente.get('Laura')
'Ingalls'

Como ves, es lo mismo que haber hecho:

>>> gente['Laura']
'Ingalls'

Pero tiene una importante diferencia. Prueba ahora esto:

>>> gente.get('Pedro')

No devuelve nada, puesto que la clave no existe, pero, al menos, no provoca un error.

Y aún hay más: podemos indicar qué valor queremos que se devuelva para el caso en que la clave no exista:

diccionario.get(clave, valor_por_defecto)

>>> gente.get('Bugs', 'Esta clave no existe')
'Esta clave no existe'

Y, como decía un viejo amigo: That’s all folks!

Javier Montero Gabarró


Python – Consultando los valores de un diccionario


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.

LaTeX: La integral definida

Objetivo: aprender a generar el símbolo de integral en LaTeX y mostrar cómo definir los límites superior e inferior.

Me siento hoy con ganas de dar una nueva incursión en el modo matemático de \LaTeX, hace ya unos cuantos días desde la última vez. A lo largo de esta serie hemos presentado bastantes elementos de la faceta matemática de \LaTeX, pero aún quedan muchos actores por entrar esta escena.

Ladies and gentlemen, señoras y señores, con todos vosotros, la agraciada y presumida integral.

Escribir una integral es tan simple como ejecutar el comando \int. Observa la siguiente instrucción:

\[
\int 2x dx = x^{2}
\]

que genera esta salida:

Ahí la tenemos, tan altiva y orgullosa.

No obstante, a poco que observes el resultado apreciarás unas consideraciones relacionadas con el diseño que podríamos mejorar. Observa que el dx está demasiado cerca del 2x.

Para separar dx de la función \LaTeX dispone del comando \, (la barra inclinada y una coma), que sirve para añadir un pequeño espacio.

Observa la nueva versión mejorada:

\[
\int 2x \, dx = x^{2}+K
\]

Esto ya es otra cosa.

Hay gente que afina más aún y prefiere acercar el símbolo de la integral al comienzo de la función. Para lograr esto disponemos del comando \! que inserta un pequeño espacio negativo (hacia atrás).

\[
\int \! 2x \, dx = x^{2}+K
\]

Nuestra afortunada integral a menudo se deja ver con dos lujosos pendientes en forma de límite superior e inferior. Para generarlos recurrimos a los socorridos subíndices y superíndices, que tanto buen apaño nos han dado ya.

Establecemos el límite inferior de la integral mediante notación subíndice y el superior con superíndice.

\[
\int_{1}^{3}  \! 2x \, dx = 8
\]

Hemos aplicado la conocida regla de Barrow del cálculo integral, por la que seguro habrás pasado alguna que otra vez en tus tiempos de estudiante, si te ha llamado la atención el artículo tanto como para leer hasta aquí.

\[
\int_{a}^{b} \! f(x)  \,dx = F(b) - F(a)
\]

en la que f(x) es una función continua en el intervalo [a, b] y F(x) es su primitiva.

Javier Montero Gabarró


Fecha de última modificación: 9 de agosto de 2012


LaTeX: La integral definida


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: Agregar y eliminar elementos de un diccionario

Objetivo: mostrar cómo agregar y eliminar elementos de un diccionario en Python.

En la anterior entrega explicamos el concepto de diccionario en Python y vimos el modo de crearlos. Hoy presentaremos dos técnicas básicas: la agregación y eliminación de elementos.

Comencemos con la creación de un par de diccionarios de ejemplo sobre los que practicaremos desde el intérprete interactivo:

>>> gazpacho = {}
>>> menda = {'Nombre':'Javier', 'Apellido':'Montero'}

El primero, gazpacho, es un simple diccionario vacío que utilizaremos para almacenar la receta del gazpacho; el otro, menda, recoge algunos datos sobre mi persona. Más adelante veremos que podemos crear estructuras de datos más complejas, basadas en los diccionarios, que podremos emplear para mantener una agenda de nuestros contactos personales y sin necesidad de recurrir a un gestor de bases de datos.

Para agregar un par clave-valor a un diccionario, recurrimos a la siguiente sintaxis:

diccionario[clave] = valor

Probémoslo con gazpacho:

>>> gazpacho['Aceite'] = '300 ml'

Verificamos que gazpacho, que antes estaba vacío, ahora contiene ese par:

>>> gazpacho
{'Aceite': '300 ml'}

Continuemos con la receta secreta:

>>> gazpacho['Vinagre'] = '100 ml'
>>> gazpacho['Pepino'] = 1
>>> gazpacho['Pimiento'] = 1

Veamos cómo evoluciona nuestra creación:

>>> gazpacho
{'Pimiento': 1, 'Aceite': '300 ml', 'Vinagre': '100 ml', 'Pepino': 1}

Observa la salida de esta última instrucción y recuerda lo que dijimos sobre el orden de los diccionarios: no son una estructura ordenada, aunque veremos formas de hacerlos más presentables si lo deseamos.

Añadamos nuevos elemendos al menda:

>>> menda['URL'] = 'http://www.elclubdelautodidacta.es'
>>> menda['Twitter'] = '@pradery'

tras lo cual,

>>> menda
{'URL': 'http://www.elclubdelautodidacta.es', 'Nombre': 'Javier', 'Twitter': '@pradery', 'Apellido': 'Montero'}

Las claves han de ser únicas. Si tratamos de agregar otra ya existente, simplemente el valor nuevo sustituirá al antiguo:

>>> gazpacho['Pimiento'] = 2
>>> menda['URL'] = 'http://elclubdelautodidacta.es/wp/'

Observa cómo los valores correspondientes son actualizados:

>>> gazpacho
{'Pimiento': 2, 'Aceite': '300 ml', 'Vinagre': '100 ml', 'Pepino': 1}
>>> menda
{'URL': 'http://elclubdelautodidacta.es/wp/', 'Nombre': 'Javier', 'Twitter': '@pradery', 'Apellido': 'Montero'}

Para borrar un par clave-valor de un diccionario disponemos de la sentencia del, que emplearemos del siguiente modo:

del diccionario[clave]

Por ejemplo:

>>> del gazpacho['Aceite']
>>> gazpacho
{'Pimiento': 2, 'Vinagre': '100 ml', 'Pepino': 1}

>>> del menda['URL']
>>> menda
{'Nombre': 'Javier', 'Twitter': '@pradery', 'Apellido': 'Montero'}

Con del podríamos cargarnos incluso el objeto completo:

>>> del gazpacho

A partir de este momento el gazpacho ha dejado de existir y ha pasado a mejor vida:

>>> gazpacho
Traceback (most recent call last):
  File "<pyshell#28>", line 1, in <module>
    gazpacho
NameError: name 'gazpacho' is not defined

Y con menda mejor no lo hago, no sea que traiga mala suerte…

Javier Montero Gabarró


Python: Agregar y eliminar elementos de un diccionario


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.

Construcción de acordes – 18: Séptima con novena aumentada

Objetivo: construir el acorde de séptima con novena aumentada (#9) sobre cualquier fundamental.

Hace unos días presentamos el acorde de séptima con novena, una de las extensiones típicas del acorde de dominante:

7(9) --> 1 - 3 - 5 - b7 - 9

La peculiaridad de un acorde de séptima de dominante, en particular, el tritono que se forma entre la 3 y la b7, confiriéndole esa tensión característica que invita a ser resuelta, hace que sea un acorde que soporte casi cualquier alteración.

Unas de las alteraciones más típicas consiste en aumentar o disminuir un semitono la novena. En el artículo de hoy nos ocuparemos del primer caso.

Aumentar un semitono la novena, haciéndola, por lo tanto, aumentada, es algo que podría entrañar cierto riesgo armónico. Pese a que, en sentido estricto, la novena está una octava por encima de la segunda, lo cierto es que la segunda aumentada está justo a un semitono de la tercera. Soportar una distancia de semitono en la estructura es algo que muy pocos acordes privilegiados pueden hacer. La familia de acordes de séptima puede permitirse ese lujo.

Si modificamos la fórmula del acorde de arriba, aumentando la novena un semitono, tenemos la fórmula del acorde de hoy:

7(#9) --> 1 - 3 - 5 - b7 - #9

Veamos un par de ejemplos: C7(#9) y A7(#9)

Como siempre, comenzamos escribiendo la escala mayor sobre cada fundamental:

Do mayor –> C – D – E – F – G – A – B – C – D (prolongándola hasta la novena)

La mayor –> A – B – C# – D – E – F# – G# – A – B

Tomamos los grados indicados en la fórmula:

C7(#9) --> C - E - G - Bb - D#

A7(#9) --> A - C# - E - G - B#

Observa que he escrito B# para que estrictamente sea una novena. A efectos prácticos puedes referirte a la novena aumentada como el enarmónico Do, en lugar de Si sostenido.

Estúdiate bien este acorde, muy común en el jazz, la música brasileña, el funk y uno de los favoritos de Jimi Hendrix.

Recuerda que dispones de una tabla de referencia de construcción de acordes con todos los que han sido tratados hasta el momento en el blog.

Javier Montero Gabarró


Construcción de acordes – 18: Séptima con novena aumentada


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 de todos los artículos de armonía.

MySQL: Eliminación de datos en una tabla

Objetivo: presentar el comando que permite la eliminación de datos de una tabla en MySQL.

En las dos últimas entregas aprendimos los fundamentos para insertar datos en tablas MySQL mediante el comando INSERT. Pero, una vez creados, ¿cómo los eliminamos?, ¿cómo los modificamos? En el artículo de hoy daremos respuesta a la primera pregunta.

Recuperemos la tabla fichajes y observemos su contenido:

mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha      | entrada  | salida   |
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
| 2012-07-02 | 08:15:00 | 17:57:00 |
| 2012-07-03 | 07:31:00 | 16:30:00 |
| 2012-07-04 | 07:25:00 | NULL     |
| 2012-07-05 | 07:45:00 | NULL     |
| 2012-07-06 | 07:30:00 | NULL     |
| 2012-07-07 | 07:15:00 | NULL     |
| 2012-07-08 | 08:01:00 | NULL     |
+------------+----------+----------+
8 rows in set (0.00 sec)

Suponte que queremos eliminar el registro del día 7 de julio. MySQL pone a nuestra disposición el comando DELETE, que usaremos del siguiente modo:

DELETE FROM tabla WHERE condición

Algo que podríamos leer como «borra de la tabla indicada aquello que cumpla cierta condición».

¿Cuál es la condición que determinará que se borre el registro? Que el campo fecha tenga por valor ‘2012-07-07’. Así pues:

mysql> DELETE FROM fichajes WHERE fecha = '2012-07-07';
Query OK, 1 row affected (0.14 sec)

Constatemos que el comando ha cumplido su misión:

mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha      | entrada  | salida   |
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
| 2012-07-02 | 08:15:00 | 17:57:00 |
| 2012-07-03 | 07:31:00 | 16:30:00 |
| 2012-07-04 | 07:25:00 | NULL     |
| 2012-07-05 | 07:45:00 | NULL     |
| 2012-07-06 | 07:30:00 | NULL     |
| 2012-07-08 | 08:01:00 | NULL     |
+------------+----------+----------+
7 rows in set (0.00 sec)

Como puedes comprobar, el registro de fecha 7 de julio ha sido eliminado de la tabla.

Es necesario que extremes la precaución siempre que uses DELETE. Si la condición de la claúsula WHERE se cumple en varios registros, serán eliminados todos ellos.

Por eso, una buena práctica consiste en ejecutar previamente un comando SELECT, bajo los mismos términos, para obtener el listado de registros afectados.

Imagina, por ejemplo, que queremos eliminar de la tabla fichajes los registros cuya hora de entrada sea superior o igual a las 7:45. Antes de proceder con el comando DELETE es interesante asegurarnos de que los registros que se van a borrar son precisamente los que queremos:

mysql> SELECT * FROM fichajes WHERE entrada >= '07:45:00';
+------------+----------+----------+
| fecha      | entrada  | salida   |
+------------+----------+----------+
| 2012-07-02 | 08:15:00 | 17:57:00 |
| 2012-07-05 | 07:45:00 | NULL     |
| 2012-07-08 | 08:01:00 | NULL     |
+------------+----------+----------+
3 rows in set (0.00 sec)

Observa el uso de la claúsula WHERE también en la sentencia SELECT para filtrar las filas a presentar.

Comprobamos que, efectivamente, esos son los únicos registros que deseamos eliminar. Podemos lanzar ya DELETE sin miedo:

mysql> DELETE FROM fichajes WHERE entrada >= '07:45:00';
Query OK, 3 rows affected (0.03 sec)

Así es como queda nuestra tabla tras esta eliminación:

mysql> SELECT * FROM fichajes;
+------------+----------+----------+
| fecha      | entrada  | salida   |
+------------+----------+----------+
| 2012-07-01 | 07:32:00 | 17:14:00 |
| 2012-07-03 | 07:31:00 | 16:30:00 |
| 2012-07-04 | 07:25:00 | NULL     |
| 2012-07-06 | 07:30:00 | NULL     |
+------------+----------+----------+
4 rows in set (0.00 sec)

¿Y si quisiéramos eliminar todos los registros de la tabla fichajes?

Exactamente igual, con la salvedad de que sobra el WHERE, pues no hay nada que filtrar, ya que no se salvará ninguno:

mysql> DELETE FROM fichajes;
Query OK, 4 rows affected (0.04 sec)

Así de simple.

mysql> SELECT * FROM fichajes;
Empty set (0.01 sec)

Nada que presentar, la tabla está más pelada que el ropero de Tarzán.

Utilizaremos la claúsula WHERE condición en numerosos contextos. Considera el artículo de hoy como un pequeño barniz…

Javier Montero Gabarró


MySQL: Eliminación de datos en una tabla


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


¡Accede al índice con todos los artículos sobre MySQL!

Python: Introducción a los diccionarios

Objetivo: entender el concepto de diccionario en Python y aprender cómo se crean.

Tengo el placer de presentarte los diccionarios de Python, estructuras de datos fascinantes y tremendamente adictivas. Con frecuencia, cuando necesito resolver mediante programación alguna necesidad, me encuentro con que los diccionarios me vienen a la cabeza de un modo natural. Son objetos muy poderosos, como irás comprobando.

Ya sabes, en otro sentido, lo que es un diccionario, llevas toda tu vida manejándolos. Abre uno cualquiera por una página al azar y dime qué ves.

Un conjunto de términos y sus definiciones, no es más que eso. Un conjunto de claves (las palabras) y sus correspondientes valores (las definiciones).

Un diccionario en Python es, en esencia, lo mismo: una colección de pares formados por claves y definiciones.

Las claves no tienen que ser, necesariamente, palabras: puede servir cualquier tipo que sea inmutable, como los números o los strings. O incluso estructuras más complejas como las tuplas (que ya sabes que son inmutables, en oposición a las listas), pero con la condición de que los elementos que las componen sean también inmutables (por ejemplo, que dentro de una tupla no exista una lista). Más adelante comprenderemos el porqué de estas «manías» que tienen las claves de los diccionarios. Los valores, en cambio, no tienen estas restricciones y pueden ser de cualquier tipo.

Hay un concepto que diferencia a los diccionarios Python de los de papel de toda la vida. En estos, las palabras (claves) están ordenadas alfabéticamente, de la a a la z. Sin embargo, aunque muchas veces nos dará la sensación de lo contrario, no hay ordenación implícita en los elementos de un diccionario en Python. Veremos que existen métodos que nos permitirán, si lo necesitamos, poner orden en ese caos, pero hazte a la idea de que los diccionarios no son estructuras ordenadas. Si te gustaba la analogía con el diccionario de papel, imagínala como si hubieras recortado todos los pares término-definición y los hubieras metido en un saco, perdiendo así su orden natural.

Pongámonos manos a la obra ya. Vamos a crear un diccionario sencillo que nos sirva para asociar a cada uno de nuestros amigos con su fecha de cumpleaños. Por ejemplo:

'Marta': '25 de abril'
'José Luis' : '5 de diciembre'

En este ejemplo, todas las claves y los valores son de tipo string, por eso los he incluido entre comillas (da igual que sean simples o dobles), pero no tendría por qué haber sido así. Nada nos impediría, tampoco, introducir un par clave-valor así:

456 : '14 de mayo'

Es decir, ni las claves ni los valores tienen por qué mantener homogeneidad en sus tipos. Naturalmente, no tendría sentido en nuestro problema particular, pero sería un par válido.

Fíjate cómo hemos separado las claves de los valores empleando dos puntos.

Para crear el diccionario, separamos cada par mediante comas y rodeamos todo el conjunto entre llaves:

>>> cumpleaños = {'Marta': '25 de abril', 'José Luis' : '5 de diciembre'}

Comprobemos el tipo de este objeto:

>>> type(cumpleaños)
<class 'dict'>

Y su valor:

>>> cumpleaños
{'Marta': '25 de abril', 'José Luis': '5 de diciembre'}

Una regla de oro que cumplen los diccionarios es que las claves han de ser únicas. Si tratas de agregar un elemento con la misma clave que otro ya existente, simplemente el valor nuevo sobreescribirá al antiguo.

Para crear un diccionario vacío procedemos del siguiente modo:

>>> dicci = {}   # Un simple par de llaves sin nada dentro
>>> type(dicci)
<class 'dict'>

Ya sabemos crear diccionarios, vacíos o con pares clave-valor dentro. Próximamente aprenderemos a agregar o eliminar datos de estas estructuras ya creadas.

Javier Montero Gabarró


Python: Introducción a los diccionarios


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