3

Estoy empezando con Python y he hecho el típico programa de número máximo y mínimo de n números introducidos por el usuario acabando cuando éste escribe 'Fin'
He utilizado un bucle while. El problema me lo da cuando intento sacarlo del bucle y me da el error del título de mi post.

El resultado debería ser como lo que sigue:

Introduce un numero:2
Introduce un numero:3
Introduce un numero:1
Introduce un numero: Fin
máximo:3
mínimo:1

El código que he escrito es el siguiente:

    mayor=None 
    menor=None
    while True:
        num=int(input('Introduce el numero: '))
        if mayor is None or num>mayor:
           mayor=num
        elif menor is None or num<menor:
           menor=num
        else:
            num=raw_input('Introduce el numero: ')
            if num=='Fin':
                break
    print mayor,'es el numero maximo'
    print menor,'es el numero minimo'

Y el resultado cuando pongo 'Fin'es: NameError: name 'Fin' is not defined

A ver si me pueden echar una mano. Muchas gracias de antemano

fedorqui
  • 15,850
  • 17
  • 58
  • 112
jonas
  • 247
  • 1
  • 9

1 Answers1

2

El método input en Python 2.x (que estás usando), evalúa una expresión Python ingresada por teclado y retorna su resultado. Si ingresas un número entero, retornara un entero, por lo que aplicar int() es redundante.

Si en lugar de un número entero ingresas un texto como "Fin", Python tratara de encontrar una variable con ese nombre para poder evaluar la expresión y retornarte algún resultado. Dicha variable no existe, eso causa el error mencionado.

Lo que debes usar es raw_input, que retorna lo ingresado por el usuario como un string. Luego convertimos el string a un valor entero. Si la conversión falla, se produce una excepción ValueError y entonces comparamos contra Fin, para ver si hay que parar o no.

También tienes un error en las comparaciones. Es necesario hacer ambas comparaciones, por que si vienen todos los valores ya ordenados en forma ascendente, nunca inicializaras menor.

Con todo, el código corregido queda así:

mayor=None
menor=None
while True:
    try:   
        leido = raw_input('Introduce el numero: ')
        num = int(leido)
        if mayor is None or num > mayor:
            mayor = num
        if menor is None or num < menor:
            menor = num
    except ValueError:
        if leido == 'Fin':
            break
            

print mayor,'es el numero maximo'
print menor,'es el numero minimo'

Versión sin excepciones

En lugar de intentar convertir lo leido a entero, primero preguntamos si es numérico usando isdigit(), y en tal caso convertimos:

mayor=None
menor=None
while True:
    leido = raw_input('Introduce el numero: ')
    if leido.isdigit():
        num = int(leido)
        if mayor is None or num > mayor:
            mayor = num
        if menor is None or num < menor:
            menor = num
    elif leido == 'Fin':
        break
                
print mayor,'es el numero maximo'
print menor,'es el numero minimo'

Más información sobre input/raw_input y Python 2.x vs 3.x en Diferencia entre input() y raw_input()

Candid Moe
  • 21,247
  • 9
  • 18
  • 40
  • Muchísimas gracias, pero se supone que no tengo que usar excepciones, por otra parte antes probé a meter una variable con el valor fin asignado y me seguía dando el mismo error.¿Si lo pongo sin la excepción funcionará? Gracias de nuevo – jonas Sep 07 '20 at 11:26
  • 1
    @jonas. Agregue la versión sin excepciones. Revisa mi respuesta. – Candid Moe Sep 07 '20 at 11:42
  • Muchísimas gracias,ahora sí, aunque el método isdigit() se supone que no lo tenía que usar ya que en la parte de temario que llevo no lo han enseñado, pero así se va a quedar, muchas gracias nuevamente. – jonas Sep 07 '20 at 12:06