¿Cuál es la condición y cuál es el cuerpo del ciclo en nuestro problema? Claramente, el cuerpo del ciclo es el ingreso de datos y la verificación de si es positivo, negativo o cero. En cuanto a la condición, es que haya más datos para seguir calculando.

Definimos una variable hayMasDatos, que valdrá Si mientras haya datos. Se le debe preguntar al usuario, después de cada cálculo, si hay o no más datos. Cuando el usuario deje de responder Si, dejaremos de ejecutar el cuerpo del ciclo.

Una primera aproximación al código necesario para resolver este problema podría ser:

def pcn_loop():
    while hayMasDatos == "Si":
        x = input("Ingrese un numero: ")
        if x > 0:
            print "Numero positivo"
        elif x == 0:
            print "Igual a 0"
        else:
            print "Numero negativo"

        hayMasDatos = raw_input("¿Quiere seguir? <Si-No>: ")

Veamos qué pasa si ejecutamos la función tal como fue presentada:

>>> pcn_loop()

Traceback (most recent call last):
    File "<pyshell#25>", line 1, in <module>
        pcn_loop()
    File "<pyshell#24>", line 2, in pcn_loop
        while hayMasDatos == "Si":
UnboundLocalError: local variable 'hayMasDatos'
    referenced before assignment
>>>

El problema que se presentó en este caso, es que hayMasDatos no tiene un valor asignado en el momento de evaluar la condición del ciclo por primera vez.

Nota Es importante prestar atención a cuáles son las variables que hay que inicializar antes de ejecutar un ciclo: al menos tiene que tener algún valor la expresión booleana que lo controla.

Una posibilidad es preguntarle al usario, antes de evaluar la condición, si tiene datos; otra posibilidad es suponer que si llamó a este programa es porque tenía algún dato para calcular, y darle el valor inicial Si a hayMasDatos.

Acá encararemos la segunda posibilidad:

def pcn_loop():
    hayMasDatos = "Si"
    while hayMasDatos == "Si":
        x = input("Ingrese un numero: ")
        if x > 0:
            print "Numero positivo"
        elif x == 0:
            print "Igual a 0"
        else:
            print "Numero negativo"

        hayMasDatos = raw_input("Quiere seguir? <Si-No>: ")

El esquema del ciclo interactivo es el siguiente:

  • hayMasDatos hace referencia a Si.
  • Mientras hayMasDatos haga referencia a Si:
    • Pedir datos.
    • Realizar cálculos.
    • Preguntar al usuario si hay más datos (Si cuando los hay). hayMasDatos hace referencia al valor ingresado.

Ésta es una ejecución:

>>> pcn_loop()
Ingrese un numero: 25
Numero positivo
Quiere seguir? <Si-No>: "Si"
Ingrese un numero: 0
Igual a 0
Quiere seguir? <Si-No>: "Si"
Ingrese un numero: -5
Numero negativo
Quiere seguir? <Si-No>: "No"
>>>

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.