2011-06-18 1 views
3

J'ai créé un programme dans lequel l'utilisateur entre un nombre, et le programme compte jusqu'à ce nombre et affiche le temps qu'il a pris. Cependant, chaque fois que j'entre des lettres ou des nombres décimaux (c'est-à-dire 0,5), j'obtiens une erreur. Voici le message d'erreur complet:ValueError: littéral invalide pour int() avec base 10

Traceback (most recent call last): 
    File "C:\Documents and Settings\Username\Desktop\test6.py", line 5, in <module> 
    z = int(z) 
ValueError: invalid literal for int() with base 10: 'df' 

Que puis-je faire pour résoudre ce problème?

Voici le code complet:

import time 
x = 0 
print("This program will count up to a number you choose.") 
z = input("Enter a number.\n") 
z = int(z) 
start_time = time.time() 
while x < z: 
    x = x + 1 
    print(x) 
end_time = time.time() 
diff = end_time - start_time 
print("That took",(diff),"seconds.") 

S'il vous plaît aider!

+2

Quel est le comportement attendu? Qu'est-ce que 'z' devrait contenir dans l'entrée est" df "ou" 0.5 "au lieu d'un nombre? – rid

Répondre

1

Essayez de vérifier

if string.isdigit(z): 

Et exécuter le reste du code si elle est un chiffre. Parce que vous comptez dans les intervalles de un, rester avec int() devrait être bon, car vous n'avez pas besoin d'un nombre décimal.

EDIT: Si vous souhaitez intercepter une exception au lieu que wooble suggère ci-dessous, voici le code pour que:

try: 
    int(z) 
    do something 
except ValueError: 
    do something else 
+6

Il est plus pythonique d'attraper l'exception. – geoffspear

+0

Aussi, si vous le pouvez, vous devriez attendre de 'faire quelque chose 'qu'après le bloc' try excepté'. De cette façon, vous êtes moins susceptible d'attraper une erreur sans rapport. – senderle

+0

string.isdigit n'est pas compatible avec Python 3.x – cwallenpoole

8

Eh bien, il vraiment un moyen de « réparer » ce, il se comporte comme attendu - vous ne pouvez pas écrire une lettre à un int, cela n'a pas vraiment de sens. Votre meilleur pari (ce qui est une façon de faire les choses pythonique), est d'écrire simplement une fonction avec un bloc try ... except:

def get_user_number(): 
    i = input("Enter a number.\n") 
    try: 
     # This will return the equivalent of calling 'int' directly, but it 
     # will also allow for floats. 
     return int(float(i)) 
    except: 
     #Tell the user that something went wrong 
     print("I didn't recognize {0} as a number".format(i)) 
     #recursion until you get a real number 
     return get_user_number() 

alors vous remplacer ces lignes:

z = input("Enter a number.\n") 
z = int(z) 

avec

z = get_user_number() 
+0

Pourquoi s'appeler récursivement en cas d'échec? C'est horriblement inefficace. –

+0

@Jeff Alors que Python n'est pas optimisé pour la récursion de queue, il doit y avoir au moins une certaine confiance pour l'utilisateur - nous devons supposer que la deuxième ou la troisième fois on leur a dit qu'ils ont foiré, ils auraient recevoir le message. En le regardant, je suppose que je pourrais le mettre dans un 'while True:' mais pour moi cela se lit comme plus explicite. – cwallenpoole

Questions connexes