Ver índice de contenidos del libro

5.4. Cómo romper un ciclo

El ciclo con centinela es muy claro pero tiene un problema: hay dos lugares (la primera línea del cuerpo y la última línea del ciclo) donde se ingresa el mismo dato. Si en la etapa de mantenimiento tuviéramos que realizar un cambio en el ingreso del dato (cambio de mensaje, por ejemplo) deberíamos estar atentos y hacer dos correcciones iguales.

Sería preferible poder leer el dato x en un único punto del programa. A continuación, tratamos de diseñar una solución con esa restricción.

Es claro que en ese caso la lectura tiene que estar dentro del ciclo para poder leer más de un número, pero entonces la condición del ciclo no puede depender del valor leído, ni tampoco de valores calculados dentro del ciclo.

Pero un ciclo que no puede depender de valores leídos o calculados dentro de él será de la forma:

  • Repetir indefinidamente:
    • Hacer algo.

Y esto se traduce a Python como:

while True:
    <hacer algo>

Un ciclo cuya condición es True parece ser un ciclo infinito (o sea que nunca va a terminar). ¡Pero eso es gravísimo! ¡Nuestros programas tienen que terminar!

Afortunadamente hay una instrucción de Python, break, que nos permite salir de adentro de un ciclo (tanto sea for como while) en medio de su ejecución.

En esta construcción:

while <condicion>:
    <hacer algo 1>
    if <condif>:
        break
    <hacer algo 2>

El sentido del break es el siguiente:

  1. Se evalúa <condición> y si es falsa se sale del ciclo.
  2. Se ejecuta <hacer algo 1>.
  3. Se evalúa <condif> y si es verdadera se sale del ciclo (con break).
  4. Se ejecuta <hacer algo 2>.
  5. Se vuelve al paso 1.

Diseñamos entonces:

  • Repetir indefinidamente:
    • Pedir dato.
    • Si el dato ingresado es el centinela, salir del ciclo.
    • Operar con el dato.

Codificamos en Python la solución al problema de los números usando ese esquema:

def pcn_loop3():
    while True:
        x = input("Ingrese un numero ('*' para terminar): ")
        if x == '*':
            break
        elif x > 0:
            print "Numero positivo"
        elif x == 0:
            print "Igual a 0"
        else:
            print "Numero negativo"

Y la probamos:

>>> pcn_loop3()
Ingrese un numero ('*' para terminar): 25
Numero positivo
 
Ingrese un numero ('*' para terminar): 0
Igual a 0
 
Ingrese un numero ('*' para terminar): -5
Numero negativo
 
Ingrese un numero ('*' para terminar): '*'
>>>

Nota Desde hace mucho tiempo los ciclos infinitos vienen trayéndoles dolores de cabeza a los programadores. Cuando un programa deja de responder y se queda utilizando todo el procesador de la computadora, suele deberse a que el programa entró en un ciclo del que no puede salir.

Estos ciclos pueden aparecer por una gran variedad de causas. A continuación algunos ejemplos de ciclos de los que no se puede salir, siempre o para ciertos parámetros. Queda como ejercicio encontrar el error en cada uno.

def menor_factor_primo(x):
    """ Devuelve el menor factor primo del número x. """
    n = 2
    while n <= x:
        if x % n == 0:
            return n
 
def buscar_impar(x):
    """ Divide el número recibido por 2 hasta que sea impar. """
    while x % 2 == 0:
        x = x / 2
    return x

Copyright (c) 2011-2014 Rosita Wachenchauzer, Margarita Manterola, Maximiliano Curia, Marcos Medrano, Nicolás Paez. La copia y redistribución de esta página se permite bajo los términos de la licencia Creative Commons Atribución - Compartir Obras Derivadas Igual 3.0 siempre que se conserve esta nota de copyright.