2017-01-06 5 views
-4

J'ai essayé de faire un traducteur de code morse python et je suis en train de le compliquer, je voudrais continuer sur le chemin que je poursuis pour le traducteur de code morse mais j'ai rencontré un problème.Pourquoi cette variable n'est-elle pas définie en Python?

Traceback (most recent call last): 
    File "python", line 114, in <module> 
NameError: name 'firstletter' is not defined 

Je n'arrivais pas à comprendre pourquoi cette variable n'était pas définie. Voici le code

wordinput = input("What do you want to convert") 
word = str(wordinput.upper) 

if word[0] == 'A': 
    firstletter = ".-" 
elif word[0] == "B": 
    firstletter = "-..." 
elif word[0] == 'C': 
    firstletter = '-.-.' 
elif word[0] == 'D': 
    firstletter = '-..' 
elif word[0] == 'E': 
    firstletter = '.' 
elif word[0] == 'F': 
    firstletter = '..-.' 
elif word[0] == 'G': 
    firstletter = '--.' 
elif word[0] == "H": 
    firstletter = '....' 
elif word[0] == "I": 
    firstletter = '..' 
elif word[0] == 'J': 
    firstletter = ".." 
elif word[0] == 'K': 
    firstletter = '-.-' 
elif word[0] == 'L': 
    firstletter = '.-..' 
elif word[0] == 'M': 
    firstletter = '--' 
elif word[0] == 'N': 
    firstletter = '-.' 
elif word[0] == 'O': 
    firstletter = '---' 
elif word[0] == 'P': 
    firstletter = '.--.' 
elif word[0] == 'Q': 
    firstletter = '--.-' 
elif word[0] == 'R': 
    firstletter = '.-.' 
elif word[0] == 'S': 
    firstletter = '...' 
elif word[0] == 'T': 
    firstletter = '-' 
elif word[0] == 'U': 
    firstletter = '..-' 
elif word[0] == 'V': 
    firstletter = '...-' 
elif word[0] == 'W': 
    firstletter = '.--' 
elif word[0] == 'X': 
    firstletter = '-..-' 
elif word[0] == 'Y': 
    firstletter = '-.--' 
elif word[0] == 'Z': 
    firstletter = '--..' 

if word[1] == 'A': 
    secondletter = ".-" 
elif word[1] == "B": 
    secondletter = "-..." 
elif word[1] == 'C': 
    secondletter = '-.-.' 
elif word[1] == 'D': 
    secondletter = '-..' 
elif word[1] == 'E': 
    secondletter = '.' 
elif word[1] == 'F': 
    secondletter = '..-.' 
elif word[1] == 'G': 
    secondletter = '--.' 
elif word[1] == "H": 
    secondletter = '....' 
elif word[1] == "I": 
    secondletter = '..' 
elif word[1] == 'J': 
    secondletter = ".." 
elif word[1] == 'K': 
    secondletter = '-.-' 
elif word[1] == 'L': 
    secondletter = '.-..' 
elif word[1] == 'M': 
    secondletter = '--' 
elif word[1] == 'N': 
    secondletter = '-.' 
elif word[1] == 'O': 
    secondletter = '---' 
elif word[1] == 'P': 
    secondletter = '.--.' 
elif word[1] == 'Q': 
    secondletter = '--.-' 
elif word[1] == 'R': 
    secondletter = '.-.' 
elif word[1] == 'S': 
    secondletter = '...' 
elif word[1] == 'T': 
    secondletter = '-' 
elif word[1] == 'U': 
    secondletter = '..-' 
elif word[1] == 'V': 
    secondletter = '...-' 
elif word[1] == 'W': 
    secondletter = '.--' 
elif word[1] == 'X': 
    secondletter = '-..-' 
elif word[1] == 'Y': 
    secondletter = '-.--' 
elif word[1] == 'Z': 
    secondletter = '--..' 





print(firstletter + secondletter) 
import os 
os.system("pause") 
+8

Bonne Seigneur, utilise un dictionnaire! Et une boucle! – kindall

+0

Il n'est pas certain que tout le code exécuté * créera * (indice) cette variable. – usr2564301

+4

Cela me fait mal aux yeux. Utilise un dictionnaire! – dawg

Répondre

3

Votre problème est avec la mission:

word = str(wordinput.upper) 

Vous ne parvenez pas à appel la fonction supérieure; à la place, vous avez affecté le descripteur de fonction à le mot. Lorsque vous convertissez ce descripteur à une chaîne, la valeur de mot est

"<built-in method upper of str object at 0x7f377ea143e8>" 

Ainsi, quelle que soit l'entrée, vous essayez de convertir « < » et « b »; le premier n'a aucune couverture dans votre liste, donc votre programme se bloque.

Modifier la ligne pour appeler la routine:

word = str(wordinput.upper()) 

TRAVAUX FUTURS

The problem will still occur if the user enters any input other than pure letters. Add a line before your long **if** to give a default value, whatever you'd like to see printed if the input isn't a letter. I use a space here: 

firstletter = ' ' 

AMÉLIORATIONS

Utilisez un dictionnaire de référence:

code = { 'A': ".-", 'B': "-...", etc. 
     } 

L'ajouter une boucle à passer par la chaîne et de convertir les lettres individuelles:

for c in word: 
    if c in code: 
     morse_char = code[c] 
    else: 
     morse_char = ' ' 
    print(morse_char) 

Est-ce que sauver votre muscles des doigts?

+1

Quelque chose de majuscule est déjà une chaîne, non? – Li357

+1

Avec juste votre correction 'upper', je reçois toujours une lettre' NameError: name '' n'est pas définie (pour toutes les entrées qui ne sont pas dans la liste d'OP).Et la solution est (encore) de définir «firstletter» devant ces horribles «si». Je vois que vous avez proposé une solution * meilleure * - mais il est préférable de souligner pourquoi OP a eu cette erreur en premier lieu. – usr2564301

+0

Je ne comprends pas le problème; cette ligne est collée directement à partir de mon exemple de travail, et c'est le seul changement. Avez-vous entré une entrée alpha uniquement? Si non, alors vous * recevez * toujours l'erreur, que j'ai couverte dans le texte. – Prune

0

Je suis d'accord, j'ai deux conseils pour vous d'abord: définir firstLetter et deuxième lettre au-dessus du si des déclarations ou deuxième

Utilisez une boucle pour convertir comme ci-dessous

wordinput = input("") 
word = str(wordinput.upper) 

for letter in range(0,len(word)+1): 
    if word[letter] == A: 
     convertedword.append(.-) 
... 
... 
...