BitBite Python #3: Aula silenciosa en ausencia de profesores

Programa para el control de las aulas en ausencia de profesores.

Técnicas tratadas:

– Bucle while controlado por centinela
– Uso de diccionarios como estructura de datos flexible.
– Comprobación de si una clave determinada figura en un diccionario
– Modificación de los valores de un diccionario
Iteración sobre todos los elementos (claves – valores) de un diccionario

Nueva entrega de la serie BitBite Python, complemento práctico de los artículos del blog, en la que se desarrollan pequeños programas completos en Python empleando técnicas ya descritas en las secciones teóricas.

Hemos dedicado los últimos artículos a presentar una de las estructuras más poderosas y flexibles de Python: los diccionarios. Hoy mostraremos un ejemplo de utilización básico.

Para entender el problema a resolver, deja que te ponga primero en antecedentes:

Tengo un recuerdo nítido de mi infancia, en el colegio, cuando cursaba 2º o 3º de EGB. Era, por entonces, muy pequeño…

En determinadas ocasiones, si el profesor debía abandonar la clase para atender alguna gestión externa, encargaba a algún alumno (normalmente, el pelota de turno) para que se ocupase de mantener el silencio en el aula. Recuerdo que uno de esos días dejó un claro mensaje: “a quien abra la boca lo apuntas en la pizarra”.

Eran tiempos en los que algunos profesores ejercían y demostraban su autoridad a base de tortazos. Todos sabíamos que aquellos cuyos nombres figurasen en la pizarra recibirían una o varias bofetadas, dependiendo de la magnitud de su falta.

Aunque, por lo general, la dureza de los castigos lograba que nos mantuviésemos callados, siempre había valientes que desafiaban a la autoridad. No eran buenos estudiantes, pero todos los respetábamos y, en cierto modo, temíamos.

Ese día quise provocar al pelotilla que vigilaba la clase y abrí la boca. Simplemente la abrí, de ella no salió ningún sonido. Pero el muy tonto me apuntó en la pizarra, tomándose al pie de la letra las instrucciones del profesor.

Naturalmente, cuando regresó el maestro recibí la bofetada de rigor. Creo que fue mi primera bofetada y lloré por la injusticia cometida. De nada me sirvió alegar que no habia pronunciado ni pío.

Ahí estaba mi nombre en la pizarra, injustamente entre los temerarios valientes:

Diego | | | |

Luis | |

Javier |

Cada barra vertical indicaba el número de veces que el alumno había infringido la regla. Si a mí me dolió, imagínate cómo le quedó la cara a Diego.

Si trasladamos esa escena unas cuantas décadas más adelante, quizás el pelota de turno tuviese delante un ordenador portátil o un Smartphone con Python instalado y podría improvisar unas sencillas líneas de código para acometer la tarea impuesta en vez de utilizar la tiza y la pizarra.

Estudiemos cómo podríamos resolver el problema…

Nos haría falta algún tipo de registro en el que anotar la misma información que escribiríamos en la pizarra: un nombre y el número de faltas cometidas.

Son dos campos de naturaleza distinta íntimamente asociados. Podemos pensar en un diccionario, con clave (única e irrepetible) el nombre del osado que se atreve a hablar y como valor el número de veces que lo hace.

Vamos a crear, entonces, un diccionario vacío que iremos rellenando conforme alguien hable. Eso es algo tan sencillo como esto:

bocazas = {}

El programa nos pregunta, por primera vez, quién ha hablado:

bocaza = input('Introduce el nombre del bocaza [0 si vuelve el profe]:')

Esto lo volverá a preguntar, una y otra vez, hasta que el profesor regrese. Necesitamos un modo de indicar al programa cuando ha ocurrido esa situación y hemos decidido que sea mediante la introducción de un 0.

Este tipo de bucles se denominan controlados por centinela. Se procesa todan las entradas hasta que llega ese valor especial, el centinela, que indica el final del ciclo.

He aquí el bucle al completo:

while bocaza != '0':
    if bocaza in bocazas:
        bocazas[bocaza] = bocazas[bocaza] + 1
    else:
        bocazas[bocaza] = 1
    bocaza = input('Introduce el nombre del bocaza [0 si vuelve el profe]:')

Observa la detección del centinela. El ciclo se repetirá mientras la variable bocaza, empleada para registrar el nombre de quien abra la boca, tenga un valor distinto de '0'. Escribo el cero entre comillas, pues la función input() devuelve strings aunque aparentemente estemos introduciendo números.

El funcionamiento del bucle es sencillo: comenzamos comprobando si el alumno ya ha incurrido en falta, en cuyo caso incrementamos en una unidad su número. Si no tenía antecedentes previos, creamos la clave en el diccionario con valor inicial uno.

No te líes con los nombres: bocazas es el diccionario y bocaza, en singular, el nombre del alumno (que actúa como clave del diccionario).

Finalmente, una vez ha sido fichado el infractor, el bucle vuelve a preguntar de nuevo por el siguiente charlatán. Y así sucesivamente hasta que el profesor regrese a la clase (momento en el cual se introducirá un cero en vez del nombre de una alumno real).

Llegado este punto, el pelota está a punto de mostrar satisfecho al profesor el resultado de su vigilancia:

print('LISTADO DE ALUMNOS QUE HAN ABIERTO LA BOCA')

for hablador, veces in bocazas.items():
    print(hablador, '-->', veces)

Nos interesa el bucle for: observa el uso del método items(), sobre el diccionario para crearnos un objeto compuesto de pares clave-valor (alumno-faltas) sobre el que podamos iterar. La variable hablador toma, uno a uno, el nombre de cada alumno, mientras que la variable veces captura el valor asociado a ese alumno en concreto.

Si hay algo que no comprendas en todo este proceso, te recomiendo que te leas los últimos artículos de la serie Python, en los que se detalla el uso de estas técnicas.

Este es, finalmente, nuestro listado completo:

# aulasilenciosa.py

# Programa para el control de aulas en ausencia de profesor
# El Club del Autodidacta

bocazas = {}

bocaza = input('Introduce el nombre del bocaza [0 si vuelve el profe]:')

while bocaza != '0':
    if bocaza in bocazas:
        bocazas[bocaza] = bocazas[bocaza] + 1
    else:
        bocazas[bocaza] = 1
    bocaza = input('Introduce el nombre del bocaza [0 si vuelve el profe]:')

#Ha regresado el profesor: es hora de delatar a los bocazas
# y que reciban su justo castigo

print() #Escribe una línea en blanco
print('LISTADO DE ALUMNOS QUE HAN ABIERTO LA BOCA')

for hablador, veces in bocazas.items():
    print(hablador, '-->', veces)

Interactuemos con él y veamos cómo trabaja:

Introduce el nombre del bocaza [0 si vuelve el profe]:Luis
Introduce el nombre del bocaza [0 si vuelve el profe]:Javier
Introduce el nombre del bocaza [0 si vuelve el profe]:Diego
Introduce el nombre del bocaza [0 si vuelve el profe]:Luis
Introduce el nombre del bocaza [0 si vuelve el profe]:Diego
Introduce el nombre del bocaza [0 si vuelve el profe]:Diego
Introduce el nombre del bocaza [0 si vuelve el profe]:Diego
Introduce el nombre del bocaza [0 si vuelve el profe]:0

LISTADO DE ALUMNOS QUE HAN ABIERTO LA BOCA
Luis --> 2
Javier --> 1
Diego --> 4

Tan sólo falta la ejecución de la sentencia. Por suerte para mí, si el pelota ya tiene un Smartphone en el que ejecutar este script, eso significa que estamos en tiempos donde los profesores ya no pegan bofetadas.

Por ahí me voy a librar.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2012/08/bitbite-python-3-aula-silenciosa-en-ausencia-de-profesores/


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

BitBite English #30: as a matter of course

Let me give you a quick piece of knowledge…

Aprender un idioma se asemeja a ser coleccionista. Coleccionas pequeñas piezas que interiorizas a través de la práctica.

La pieza de hoy es a matter of course. Si ya es tuya, quizás no venga mal recordarte que la posees; si no es el caso, considera esta breve lectura una invitación a que lo sea.

Pero es sólo una invitación: no la poseeras salvo si pones de tu parte para que así sea.

Poner de tu parte no significa otra cosa que usarla. Tan pronto termines de leer esto, intenta crear un par de frases con ella.

Repítelo al día siguiente y al otro. Si es preciso, mantén un registro de cada pieza que incorpores a tu repertorio.

Try to practice every single word or phrase you learn as a matter of course.

as a matter of course; por costumbre, por principio, automáticamente, de modo habitual

Cuando haces algo as a matter of course lo haces automáticamente, sin pararte a cuestionarlo.

Do you think chess should be taught in school as a matter of course?

I really think so, as a matter of fact… I love chess.

Your move: make this piece yours!

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2012/07/bitbite-english-30-as-a-matter-of-course/


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 BitBite English si te gusta esta serie.

BitBite English #29: sleep like a log – not sleep a wink

Ya lo cantaban los Beatles en la genial A hard day’s night, del album del mismo nombre:

It’s been a hard day’s night
And I’ve been working like a dog
It’s been a hard day’s night
I should be sleeping like a log

sleep like a log -> dormir como un tronco

Literalmente, ¿por qué no? Muchas expresiones en ingles son exactas a las nuestras. Log significa eso: tronco.

Para conocer la expresión contraria recurrimos nuevamente a los Beatles en una canción del álbum blanco: I’m so tired. Aprender canciones ayuda poderosamente a dominar un idioma…

I’m so tired
I haven’t slept a wink

not sleep a wink –> no pegar ojo

Estoy tan cansado que no he pegado ni ojo…

Aquí la literalidad no nos sirve (wink significa guiño).

Es lo que tiene aprender los usos de un idioma: aunque hay muchas coincidencias, no siempre es así, por lo que es recomendable estudiarlos, practicarlos e interiorizarlos antes de emplearlos por primera vez.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2012/05/bitbite-english-29-sleep-like-a-log-not-sleep-a-wink/


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

BitBite Python #2: Sumando las cifras

El camino hacia la pericia como programadores está plagado de ejercicios que van poniendo a prueba nuestra capacidad. Es absolutamente necesario pasar por ellos: resolviendo los problemas más elementales adquirimos las técnicas que nos permitirán afrontar los más complejos.

El programa de hoy es bien simple. Le pediremos al usuario que introduzca un número entero y nuestra misión será calcular la suma de todas sus cifras.

En el camino veremos cómo recorrer una cadena de caracteres (string) de principio a fin. Los strings son otro tipo de secuencias, como las tuplas o las listas y, como todas las secuencias, podemos acceder a sus elementos individualmente.

Comencemos solicitando la introducción del número y almacenando el dato en una variable:

numero=input('Introduce un número de las cifras que quieras: ')

Este tipo de sentencia ya te es familiar, pero no olvides que la entrada de input es una cadena de caracteres, aunque sólo hayamos introducido cifras numéricas. Es decir, la variable numero referencia a un string.

No estamos tratando, por el momento, los posibles errores de entrada. Confiamos en la buena fe del usuario, que sólo introducirá números.

Inicializamos la variable que contendrá la suma de todas las cifras:

suma=0

Vamos a recorrer ahora el string introducido desde el primer elemento hasta el último. Utilizaremos un bucle for:

for cifra in numero:
    suma+=int(cifra)

La variable cifra recorrerá uno a uno, todos los elementos de la secuencia (un string en este caso) de principio a fin. Por ejemplo, si numero es el string ‘207’, en la primera pasada del bucle, cifra es el carácter ‘2’, en la segunda ‘0’ y en la tercera ‘7’.

Date cuenta de que he rodeado cada cifra entre comillas. Esto es así porque los elementos de un array son caracteres simples, aunque representen un número.

Al ser caracteres simples y no números, para poder sumarlos necesitamos convertirlos a enteros. Para ello utilizamos la función int() que vemos en el bloque del for.

Una vez ha concluido el for tras recorrer todo el string, estamos en condiciones de imprimir el resultado final:

print(suma)

El programa sumacifras.py contiene el código completo de este sencillo ejercicio.

Javier Montero Gabarró


BitBite Python #2: Sumando las cifras


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

BitBite Python #1 – Aleatoria

Primera entrega de la nueva serie BitBite Python, dedicada íntegramente a mostrar código diverso en acción. No se puede aprender a programar simplemente leyendo teoría; es necesario arremangarse y ponerse a escribir código, planteando y resolviendo problemas concretos. Pero, al igual que cuando se aprende física o matemáticas, el estudio de problemas resueltos debe servir para enriquecer los recursos disponibles a la hora de enfrentarnos con otros desafíos.

Todo el código que aparecerá en esta serie habrá sido tratado adecuadamente en los capítulos de teoría y deberás remitirte a ellos si algún concepto no lo tuvieses suficientemente claro. Piensa en estos programas como la práctica necesaria que complementa los artículos teóricos. Aunque se puede aprender a programar simplemente estudiando otros programas y programando, estudiar la teoría te allanará y acortará el camino.

En el artículo Productividad Aleatoria, describí una técnica que empleo eventualmente para seguir siendo productivo incluso cuando la indecisión me paraliza a la hora de elegir la próxima tarea a afrontar: eligiéndola al azar.

Para ello, utilizo el generador de números aleatorios de random.org, o el propio widget que he colocado en el pie de página del blog.

Vamos a realizar un programa en Python que se ocupe precisamente de esto mismo: la elección de un número entero al azar dentro de un rango especificado por el usuario.

Comenzamos…

import random

La función clave del programa se encuentra dentro del módulo de la librería de Python, random.py, especializado en el manejo de números aleatorios. Debemos importar el módulo para poder utilizar las funciones que contiene.

min = int(input('Mínimo: '))
max = int(input('Máximo: '))

Introducimos el rango de valores entre los cuales, inclusive, se elegirá el número al azar. Observa la conversión explícita a entero con int, pues input nos devuelve una cadena de caracteres.

aleatorio = random.randint(min, max)

Elegimos un número aleatorio entre min y max y lo almacenamos en la variable aleatorio. La función randint se ocupa de esta elección, cuyos parámetros definen el rango del que se tomará el entero al azar. Fíjate que para poder utilizarla es preciso anteponer al nombre de la función el nombre del módulo al que pertenece, separados por un punto.

Si no hubiésemos convertido min y max a enteros, el programa devolvería un error, pues los parámetros que la función randint requiere deber ser de ese tipo, y no strings.

print('Número aleatorio entre', min, 'y', max, '--> ', aleatorio)

Finalmente, mostramos el resultado de la elección.

El fichero aleatoria.py contiene el código fuente completo del programa.

Javier Montero Gabarró


http://elclubdelautodidacta.es/wp/2012/02/bitbite-python-1-aleatoria/


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

BitBite English #28: Can you play chess?

Esta es una construcción típica que, por inercia, suele ofrecer cierta dificultad a los que empiezan en el estudio del idioma inglés.

Para expresar la habilidad de hacer algo solemos utilizar el verbo can:

¿Sabes conducir un coche? Can you drive a car?

I can read musicSé leer música

Can you swin?¿Sabes nadar?

Traducir la frase anterior en su sentido literal, ¿puedes nadar?, sería un error y significaría algo diferente (por ejemplo, sabemos nadar, pero tenemos una lesión en el hombro que nos impide hacerlo en ese momento).

Podemos responder a estas preguntas afirmativamente: Yes, I can.

O negativamente: No, I can’t.

Can you speak english? Read BitBite English. I’m sure this series of articles will help you improve your language skills.

Javier Montero


BitBite English #28: Can you play chess?


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

BitBite English #27: as like as two peas

It’s been two months since our last BitBite. I hope it’s here to stay with us again.

La palabra inglesa like es, sin duda, gran conocida de todos. La usamos típicamente como verbo:

I don’t like mondays

o como preposición:

Fly like a bird

Su uso como adjetivo es algo más avanzado y es nuestro tema de hoy.

like; similar, parecido

El contrario es unlike; distinto, diferente

La frase del título ilustra este uso:

They are as like as two peas; son como dos gotas de agua

La traducción literal es son tan PARECIDOS como dos guisantes.

También dice as like as two peas in a pod. Pod es la vaina que recubre los guisantes.

Remember the good old school days when you studied Physics:

Like charges repel each other; unlike charges attract each other.

Las cargas del mismo signo se repelen, las de distinto se atraen.

¿Cómo no?

Javier Montero


http://elclubdelautodidacta.es/wp/2011/11/bitbite-english-27-as-like-as-two-peas/


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

BitBite English #26: What do we call…?

What do we call a person whose profession is the care and treatment of the teeth?

A dentist.

What do we call the central or most important part of something?

The core.

What do we call…? ¿Cómo llamamos a …?

A joke:

What do you call a fish without an eye?

Answer: Fsh

(‘eye’ se pronuncia ‘ai’, igual que la letra “i”)

Javier Montero

BitBite English #25: What with one thing and another

It was a long day yesterday…

I woke up early in the morning and went to bed late at night. It was a very intense day.

What with one thing and another, I didn’t have time to write in the blog.

What with one thing and another…, Entre una cosa y otra

Such is life. I’m sorry.

Javier Montero

BitBite English #24: fair-weather friends

En el BitBite de ayer hablamos de los “falsos amigos”, aquellos términos del idioma inglés que podían inducirnos a errores por su gran similitud con los nuestros, pero con significado diferente.

Hoy hablaremos también de falsos amigos, pero de otro modo…

Hablaremos de aquellos amigos que sólo se acuerdan de ti cuando te necesitan, aquellos que sólo se acercan cuando las cosas te van bien y pueden aprovecharse de ti.

fair-weather friends, amigos de conveniencia

Mientras haga “buen tiempo” y puedan disfrutar de él estarán a tu lado, no lo dudes…

Fair-weather friends aren’t much help in case you are having trouble.

You can’t count on them.

Javier Montero