2016-10-11 1 views
-1

Donc j'essaye d'écrire un petit script en python qui va différencier les entrées, et quand l'entrée appropriée est donnée, un int, il donnera la réponse corrélative. Je sais qu'il y a un certain nombre de messages sur ce sujet qui sont similaires mais j'avais du mal à trouver ma réponse. Voici ce que j'ai.Nameerror: nom 'h' n'est pas défini

oktas = input("Oktas: ") 

def sky_condition(oktas): 
    if isinstance(oktas, int) == True: 
     if oktas == 0: 
     print ("CLR") 
     elif oktas == 1 or oktas == 2: 
     print ("FEW") 
     elif oktas == 3 or oktas == 4: 
     print ("SCT") 
     elif oktas >= 5 and oktas <= 7: 
     print ("BKN") 
     elif oktas == 8: 
     print ("OVC") 
     elif oktas < 0 or oktas > 8: 
     raise ValueError("Oktas provided are above or below the allowed limits.") 
    elif isinstance(oktas, int) == False: 
     raise NameError("You suck at following instructions.") 

skycondition(oktas) 

Lorsque vous mettez dans un int ou un str (comme quelque chose dans « guillemets »), il traite tout comme il se doit. Toutefois, si je mets juste une lettre ou un mot sans guillemets, par exemple h, il déclenche l'erreur

NameError: name 'h' is not defined 

Il produit l'erreur que je veux, mais pas comment je le voulais. Comment puis-je le coder afin qu'il soulève l'erreur comment je le veux?

+1

Est-ce Python 2? Si c'est le cas, vous devriez utiliser 'raw_input' au lieu de' input', puis essayer de convertir en entier en utilisant int (oktas) '. (aussi, ajoutez la balise 'python-2.x' car il s'agit d'une zone où le comportement est différent de celui de Python 3) – Aurora0001

+0

' isinstance' renvoie déjà une valeur booléenne; il n'est pas nécessaire de vérifier si elle est égale à une autre valeur booléenne pour générer une * troisième * valeur booléenne. – chepner

+0

Voir les nuances de 'input' (qui semble être votre problème) dans cet autre [stackoverflow réponse] (http: // stackoverflow.com/a/15129556/5847976) – jadsq

Répondre

3

Plusieurs choses mal avec votre code, je vais essayer de les signaler, les réparer et vous expliquer ce que vous faites mal.

oktas = input("Oktas: ") #returns str only if you are running Python 3.x+. 
         #returns int if it's an int for Python 2.x 
         #not sure which version of python you are running. 

def sky_condition(oktas): 
    if isinstance(oktas, int) == True: 
     if oktas == 0: 
     print ("CLR") 
     elif oktas == 1 or oktas == 2: 
     print ("FEW") 
     elif oktas == 3 or oktas == 4: 
     print ("SCT") 
     elif oktas >= 5 and oktas <= 7: 
     print ("BKN") 
     elif oktas == 8: 
     print ("OVC") 
     elif oktas < 0 or oktas > 8: 
     raise ValueError("Oktas provided are above or below the allowed limits.") 
    elif isinstance(oktas, int) == False: 
     raise NameError("You suck at following instructions.") 

sky_condition(oktas) # you had skycondition(oktas) which wasn't your function name. 

Dans l'ensemble ce programme fonctionne, juste des fautes de frappe de votre côté. Si vous exécutez Python 3, vous devrez effectuer une vérification d'erreur pour l'entrée oktas car, comme je l'ai dit, Python 3.x renvoie un str pour input(). Vous aurez besoin de lancer l'entrée avec int(oktas), mais cela irait à l'encontre de l'objectif de votre vérification isinstance() puisque ce sera un int. Une bonne façon de contourner cela est:

if oktas.isdigit(): 
    oktas = int(oktas) 
    #rest of your code 

La fonction isdigit() renvoie true si une str contient des chiffres 0-9 seulement, vous pouvez lancer votre oktas int.

Comme le dit le commentaire si vous utilisez Python 2.x vous devriez éviter d'utiliser input() et d'utiliser raw_input(). Quelques raisons:

raw_input() fondamentalement il retournera un str objet, peu importe ce que vous donnez. Si vous lui donnez 5 il vous donnera un objet str: "5" Si vous lui donnez "5" il vous donnera un objet str: "5"

input() c'est là votre problème. En entrée Python 2.x fait essentiellement eval(input()). Vous pouvez lire sur eval ici. Fondamentalement, il essaie d'évaluer l'expression donnée. Puisque les nombres et les chaînes sont des expressions elles-mêmes, il va essayer d'exécuter votre entrée h comme littéralement h au lieu d'une chaîne de caractères. Utilisez à nouveau raw_input() pour éviter cela dans Python 2.x.

Je suppose que vous utilisez Python 2.x ou vous avez d'autres codes que vous ne montrez pas. Utilisez raw_input() et lancez votre entrée en conséquence.

+2

Cela ne concerne pas spécifiquement pourquoi les entrées telles que 'h' ne fonctionnent pas, mais' 'h '' le fait. Vous devriez expliquer pourquoi cela ne fonctionne pas pour aider l'OP à comprendre plus (peut-être mentionner que 'input' de Python 2 utilise' eval'?) – Aurora0001

+1

Assez juste je vais l'éditer. – MooingRawr