Tengo esta función a continuación, en la que he hecho algo mal en alguna parte.

def quantityFunction(product):
    valid = False
    while True:
        if product is not None:
            quantity = input("Please enter the amount of this item you would like to purchase: ")
            for i in quantity:
                try:
                    int(i)
                    return int(quantity)
                    valid = True
                except ValueError:
                    print("We didn't recognise that number. Please try again.")
                    #If I get here, I want to loop back to the start of this function
                    return True

        return False

Para ejecutar, la función se llama desde la parte principal del programa de la siguiente manera: quantity = quantityFunction(product)

El retorno Falso en la parte inferior del código tiene que ver con si el producto es Ninguno, que se necesita después de un poco de código en otra función pero ha tenido que ir en esta función.

Si la entrada del usuario para la cantidad es un número, todo funciona bien. Si se trata de algo más, se imprime el Error de valor y puede ingresar otra entrada. Si ingresa otra letra, etc., se repite nuevamente, si ingresa un número, lo acepta.

Sin embargo, no devuelve el número que ingresó después de las letras. Simplemente devuelve 0.

Sospecho que esto tiene algo que ver con la forma en que estoy repitiendo el código, es decir, el código debe volver al inicio de la función si llega al Error de valor.

¿Algunas ideas?

2
Nathan Shoesmith 7 jun. 2016 a las 20:32

5 respuestas

La mejor respuesta

Tu dijiste:

el código debe volver al inicio de la función si llega al Error de valor.

Entonces no debe usar declaraciones return, de lo contrario la función terminará, devolviendo True o False.

3
heltonbiker 7 jun. 2016 a las 17:45

Pocos problemas:

1) La instrucción return devuelve el control a la función de llamada.

2) Está haciendo un bucle sobre la entrada, lo cual está mal.

3) valid=True no se ejecuta en absoluto.

def quantityFunction(product):
    valid = False
    while True:
        if product is not None:
            quantity = raw_input("Please enter the amount of this item you would like to purchase: ")
            try:
                    return int(quantity)
                    #valid = True (since it is never run)
            except ValueError:
                    print("We didn't recognise that number. Please try again.")
                    #If I get here, I want to loop back to the start of this function
                    #return True 
        return False

quantityFunction("val")

Nota: Utilice raw_input() en el caso de Python 2.7 y input() en el caso de 3.x

3
gaganso 7 jun. 2016 a las 17:55

Pruebe esto (también se incluye algún formato, pero la funcionalidad debería ser la misma):

def determine_quantity(product):  # descriptive function name
    if not product:  # avoiding nesting
         return False
    while True:
        quantity = input("Please enter the amount of this item you would like to purchase: ")
        try:
            return int(quantity)  # try to convert quantity straight away
        except ValueError:
            print("We didn't recognise that number. Please try again.")
            # nothing here means we simply continue in the while loop

Idealmente, sacarías el producto. Una función debe hacer lo menos posible, y esta verificación es mejor en otro lugar.

def determine_quantity():
    while True:
        quantity = input("Please enter the amount of this item you would like to purchase: ")
        try:
            return int(quantity)
        except ValueError:
            print("We didn't recognise that number. Please try again.")
1
Ben 7 jun. 2016 a las 18:04

Deberías probar esto ...

def quantityFunction(product):
    valid = False
    while True:
       if product is not None:
          quantity = raw_input("Please enter the amount of this item you would like to purchase: ")

          if quantity.isdigit():
             return int(quantity)
             valid = True
          else:
             print("We didn't recognise that number. Please try again.")
             continue

       return False

quantity = quantityFunction("myproduct")
1
Aniket Pawar 7 jun. 2016 a las 18:11

Primero, abordemos el código. En pocas palabras, desea una función que se repita hasta que el usuario ingrese una cantidad legal.

producto no hace mucho por la función; compruébalo en el programa de llamadas, no aquí. Deje que la función tenga un único propósito: obtener una cantidad válida.

Trabajemos desde allí en la receta estándar para "bucle hasta una buena entrada". Muy simple, se ve así:

Get first input
Until input is valid
... print warning message and get a new value.

En código, se ve así.

def get_quantity():
    quantity_str = input("Please enter the amount of this item you would like to purchase: ")

    while not quantity_str.isdigit():
        print("We didn't recognise that number. Please try again.")
        quantity_str = input("Please enter the amount of this item you would like to purchase: ")

    return quantity

En cuanto a la práctica de codificación ...

Desarrolle de forma incremental: escriba algunas líneas de código para agregar la función one a lo que tiene. Depurar eso. Haz que funcione antes de agregar más.

Aprende las características de tu idioma. En el código que ha publicado, utiliza incorrectamente para , en , retorno y una llamada de función.

Busca cómo resolver problemas simples. probar / excepto es un concepto más difícil de manejar que el simple isdigit .

1
Prune 7 jun. 2016 a las 18:05