¿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 aSi
.- Mientras
hayMasDatos
haga referencia aSi
:- 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"
>>>