2010-10-19 3 views
3

essayé de résoudre celui-ci pendant un certain temps et ne peut pas sembler le faire fonctionner à droite .. voici mon travail actuelComment déterminer quand l'entrée est alphabétique? Je

while True: 

    guess = int(raw_input('What is your number?')) 

    if 100 < guess or guess < 1: 
     print '\ninvalid' 

    else: 
     .....continue on 

En ce moment, je l'ai fait alors quand une entrée utilisateur un plus grand nombre 100 ou inférieur à 1, il imprime "invalide". MAIS et si je veux le faire quand un utilisateur a entré une chaîne qui n'est pas un nombre (alphabétique, ponctuation, etc.) il renvoie également ce message "invalide"?

J'ai pensé à utiliser sinon ... isdigit(), mais cela ne fonctionnera pas puisque j'obtiens l'estimation comme un nombre entier pour que la gamme ci-dessus fonctionne. Essayez/except est une autre option que j'ai pensé, mais je n'ai toujours pas compris comment l'implémenter correctement.

+2

Vous pouvez également faire 'si 1 <= deviner <= 100:' wow – Daenyth

Répondre

6

Vous pouvez utiliser la gestion des exceptions:

try: 
    guess = int(raw_input('What is your number?')) 
    if not (1 <= guess <= 100): 
     raise ValueError 
    # .....continue on 
except ValueError: 
    print '\ninvalid' 

De cette façon, \ninvalid sera imprimé si l'utilisateur soit entrées une chaîne non numérique ou les entrées d'une chaîne numérique supérieure à 100 ou inférieure à 1.

EDIT: D'accord, je me soumets à la syntaxe x < y < z. Toujours pense qu'il perd une partie de son charme quand il est utilisé avec not, cependant.

+1

merci Frédéric votre code semble beaucoup plus simple. Bien que je n'ai jamais appris ce que "raise" est en python, dans quelles circonstances pouvez-vous l'utiliser? et en quoi cela profite-t-il? Je vous remercie! et merci à tous ceux qui ont contribué – neogeo

+0

@neogeo, 'raise' vous permet de lancer des exceptions vous-même (voir [http://python.about.com/od/gettingstarted/ss/begpyexceptions_7.htm](http://python. about.com/od/gettingstarted/ss/begpyexceptions_7.htm)). Dans votre cas, 'int()' soulève 'ValueError' si la valeur transmise n'est pas numérique. Si nous étendons ce comportement en augmentant également 'ValueError' si la valeur est numérique mais en dehors de notre domaine, nous pouvons gérer les deux cas d'erreur au même endroit en même temps. –

5
while True: 
    try: 
    guess = int(raw_input("...")) 
    except EOFError: 
    print "whoa nelly! EOF? we should probably exit" 
    break # or sys.exit, or raise a different exception, 
    # or don't catch this at all, and let it percolate up, 
    # depending on what you want 
    except ValueError: 
    print "illegal input: expected an integer" 
    else: 
    if not (1 <= guess <= 100): 
     print "out of range" 
    else: 
     print "processing guess... (but if it wasn't 42, then it's wrong)" 
     break # out of while loop after processing 
+0

+1 pour mettre un nombre minimal de lignes entre 'try' et' except', et aussi pour utiliser la syntaxe '1 <= guess <= 100'. – EOL

+0

J'aime le manque de duplication de Fred, mais il y a plus de bits de Python dans cela. ('x

+0

@Nick: Souvent vous manipulez une entrée * illégale * (c'est-à-dire pas un nombre) différemment de l'entrée * invalide * (c'est-à-dire hors de portée), même si ce n'est que pour informer l'utilisateur plus d'informations. Une fois que cela arrive, il n'y a pas de duplication. (Caveat emptor: Cette distinction entre "illégal"/"invalide" en termes de termes n'est pas importante, je ne l'ai même pas suivi à l'origine, et je ne connais personne qui assume la distinction sauf si spécifié. la même idée dans les spécifications techniques/standardese.) –

Questions connexes