Python – Capítulo 9: Atrapado en el día de la marmota

Objetivo: presentar la sentencia break, que nos permite abandonar un bucle en cualquier momento.

En el capítulo anterior explicamos la estructura while, gracias a la cual podemos repetir en bucle un determinado conjunto de instrucciones.

El funcionamiento era sencillo: evaluábamos una determinada condición y, si era verdadera, ejecutábamos el bloque completo de instrucciones indentadas bajo la instrucción while. Una vez hecho esto, reevalúabamos la condición y, si esta volvía a ser cierta, repetíamos nuevamente el bloque. Así sucesivamente, finalizando el bucle en el momento en que la evaluación de la condición resultara falsa.

Es importante tener en cuenta que, si la condición es verdadera, el conjunto de instrucciones se ejecutará al completo. Todo, si se cumple; o nada, si no.

Pero, ¿y si deseamos abandonar bruscamente el bucle en cualquier momento, sin esperar a que se haya ejecutado el bloque completo o que la evaluación resulte falsa?

La sentencia break se ocupa de esto. Cuando se ejecuta, se sale completamente del bucle, sin esperar a su conclusión y sin repetir ninguna iteración más.

Observa el siguiente programa:

# coding=latin-1

mayor = 0

while True:
    numero = int(input('Introduce un número natural (0 para terminar): '))
    if numero == 0:
        break
    if numero > mayor:
        mayor = numero

print('El número más alto introducido es ', mayor)

Se nos pide que introduzcamos un conjunto de números naturales (es decir, enteros positivos) y se trata de determinar cuál es el mayor de todos ellos. Cuando no queramos introducir más números escribiremos el valor cero (ajeno al conjunto de los naturales), momento en el que el programa sabrá que ha llegado al final y deberá presentar el resultado.

Comencemos observando la sección con el bucle while:

while True:
    numero = int(input('Introduce un número natural (0 para terminar): '))
    if numero == 0:
        break
    if numero > mayor:
        mayor = numero

Lo primero que debe llamarnos la atención es la condición que hemos utilizado. No es una expresión lógica cualquiera.

Las expresiones lógicas dan como resultado dos posibles valores: True o False (la primera letra ha de escribirse con mayúsculas). Es decir, o son verdaderas o falsas.

La expresión True, tal como está en el bucle es siempre verdad. No hay verdad más verdadera que esa. Por lo tanto, su efecto va a ser provocar un bucle infinito, pues la condición siempre va a ser cierta en cada reevaluación. Estamos atrapados en un ciclo sin fin; ¿cómo podríamos escapar de él?

Analicemos con detalle lo que sucede dentro del bucle while:

numero = int(input('Introduce un número natural (0 para terminar): '))

Introducimos un número, lo convertimos a entero (recordemos que el resultado de input es un string, y no un número) y lo asignamos a la variable numero que, en la primera iteración, queda así inicializada (un término relacionado con la programación) con el valor que introduzcamos.

Prosigue el bucle con:

    if numero == 0:
        break
    if numero > mayor:
        mayor = numero

Si el número introducido, almacenado en numero, es cero, se ejecuta la sentencia break.

La sentencia break es drástica: abandona el bucle directamente, sin esperar a que se repita más veces y sin esperar tampoco a completar el resto de instrucciones pendientes del bloque.

Estamos ante un bucle controlado por centinela. A través de la variable numero, estamos atentos, vigilando cuándo se introduce un valor especial que nos hará salir del bucle. El centinela ha de ser un elemento ajeno al conjunto posible de valores susceptibles de ser procesados, por eso elegimos el cero. Habría servido también cualquier entero negativo.

Llegamos al corazón del algoritmo: si el número introducido (numero) es mayor que el que guarda la variable mayor, hacemos que ésta cambie de valor con ese otro número. De este modo nos aseguramos que mayor tenga siempre el mayor de los números que han ido entrando en escena.

Dijimos que todas las variables habían de ser inicializadas antes de poder utilizar su nombre. Por eso, justo antes de entrar en el bucle while nos encontramos la línea

mayor = 0

en la que inicializamos la variable mayor con el valor 0.

Si no hubiéramos hecho esto, el programa habría devuelto un error, al encontrar, dentro del bucle, una variable sin inicializar.

El bucle se repetirá una y otra vez hasta que introduzcamos un cero, valor que hemos elegido como centinela y que disparará la sentencia break.

Una vez hemos salido del bucle, se ejecuta la última instrucción del programa, que imprime el resultado buscado:

print('El número más alto introducido es ', mayor)

Almacena estas técnicas elementales en tu repertorio y no olvides la sentencia break, no sea que en tu radio un día suene la misma canción cada mañana a la misma hora.

Javier Montero Gabarró


Fecha de la última revisión: 29 de mayo de 2013


http://elclubdelautodidacta.es/wp/2011/07/python-capitulo-9-atrapado-en-el-dia-de-la-marmota/


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.

Python – Capítulo 8: La estructura "while"

Objetivo: presentar la estructura de control while en Python para la repetición de un bloque de instrucciones en tanto y cuanto se cumpla determinada condición.

Supongamos que tenemos un determinado conjunto de instrucciones que queremos repetir en bucle siempre que se cumpla cierta condición. Python resuelve esto a través de la estructura while (que significa mientras, en inglés).

La filosofía es sencilla: mientras se cumpla una condición dada, repite un conjunto de instrucciones.


while condición:
    instrucción 1
    instrucción 2
    instrucción n

Recuerda que la forma que tiene Python para delimitar los bloques de instrucciones es a través de su indentación.

¿Cómo funciona el bucle while?

Se evalua la condición al comienzo del bucle. Si es verdadera, True, el conjunto completo de instrucciones indentadas se ejecuta. Una vez concluido, volvemos arriba y reevaluamos nuevamente la condición. Si sigue siendo cierta, repetimos de nuevo el bucle.

Y así sucesivamente. En el momento en el que la evaluación al comienzo sea falsa, False, el bucle dejará de ejecutarse y el programa saltará a la siguiente instrucción fuera de él.

Recuerda el programa del artículo anterior:


valor = input('Introduce un número del 1 al 6: ')
if int(valor) == 1:
    print('El dado rueda..., ha salido el UNO')
elif int(valor) == 2:
    print('La suerte está echada..., ha salido el DOS')
elif int(valor) == 3:
    print('El dado nos muestra... un TRES')
elif int(valor) == 4:
    print('Increíble pero cierto... ha salido un CUATRO')
elif int(valor) == 5:
    print('Si esto fuera el parchís sacarías ficha. Ha salido el CINCO')
elif int(valor) == 6:
    print('Enhorabuena, has sacado el valor más alto del dado, el SEIS')
else:
    print('Lo siento, el dado no puede devolver ese valor')

Se nos requería la introducción de un número y, si este correspondía a una cara del dado (valor entre uno y seis), nos mostraba su valor. En el caso de que el número no estuviese en el rango adecuado, nos instaba a que volviéramos a intentarlo y el programa concluía. Pero volver a intentarlo implicaba volver a lanzar el programa de nuevo.

El programa siguiente lo hemos mejorado para que no haya que volver a ejecutarlo en el caso de que no se introduzca un valor adecuado:


valor = int(input('Introduce un número del 1 al 6: '))
while valor<1 or valor>6:
    print("Por favor, el número ha de ser un número entre el uno y el seis.")
    valor = int(input('Introduce un número del 1 al 6: '))
if valor == 1:
    print('El dado rueda..., ha salido el UNO')
elif valor == 2:
    print('La suerte está echada..., ha salido el DOS')
elif valor == 3:
    print('El dado nos muestra... un TRES')
elif valor == 4:
    print('Increíble pero cierto... ha salido un CUATRO')
elif valor == 5:
    print('Si esto fuera el parchís sacarías ficha. Ha salido el CINCO')
elif valor == 6:
    print('Enhorabuena, has sacado el valor más alto del dado, el SEIS')

Observemos el bucle while, justo desde la línea anterior a él:


valor = int(input('Introduce un número del 1 al 6: '))
while valor<1 or valor>6:
    print("Por favor, el número ha de ser un número entre el uno y el seis.")
    valor = int(input('Introduce un número del 1 al 6: '))

Justo antes del while le pedimos al usuario que introduzca el valor, que inmediatamente después cotejaremos.


valor = int(input('Introduce un número del 1 al 6: '))

Observa, como diferencia respecto al programa anterior, que esta vez hemos utilizado la función int() directamente en la captura de input(), de modo que la variable valor ya contiene un entero y no será necesaria su posterior conversión en cada elif.

Llegamos al fin a la condición del bucle while:

while valor<1 or valor>6:

Queremos que, si el valor no se corresponde con una tirada del dado, nos lo diga y, además, vuelva a ofrecernos el mensaje incitándonos a introducir otro diferente, labor de la que se ocuparán las dos instrucciones del bloque.

Si el número entero introducido no está en el rango entre uno y seis significa que, o bien es menor que uno, o bien es mayor que seis. Eso es lo que muestra la condición. El operador lógico or devuelve True cuando cualquiera de los dos operandos que están a su lado es verdadero. El bucle se repetirá continuamente hasta que introduzcamos un valor adecuado. Sólo entonces la condición será False y podremos seguir con las instrucciones if posteriores.

Nada más por hoy. Dispones de una herramienta poderosa para el control de flujo de tus programas en Python. Experimenta con ella y asegúrate de comprenderla con claridad antes de proseguir con contenidos más avanzados.

Javier Montero Gabarró


Fecha de la última revisión: 12 de agosto de 2012


http://elclubdelautodidacta.es/wp/2011/06/python-capitulo-8-la-estructura-while/


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