2017-03-15 1 views
1

Pour mon code de cryptage, j'essaie de renvoyer une valeur d'une fonction car elle est utilisée dans la suivante. Je continue à recevoir une erreur, me disant que le nom 'cipher_text' n'est pas défini. S'il vous plaît aider!Fonction Python - La valeur de retour est 'non définie'

Erreur:

(ligne 7)

décryptage (cipher_text, changement)

NameError: nom 'cipher_text' est pas défini

def main(): 
    user_input = input ("Enter string: ") 
    shift = int(input ("Enter a shift that is between 1 and 26: ")) 
    while shift<1 or shift>26: 
     shift = input ("ERROR: Shift must be between 1 and 26: ") 
    encryption (user_input, shift) 
    decryption (cipher_text, shift) 
    frequency (user_input) 

def frequency(user_input): 
    freq_char = None 
    for char in user_input: 
     charcount = user_input.count(char) 
     if (charcount != 0): 
      freq_char = char 
    print (freq_char) 
    return fre_char 

def encryption(user_input, shift): 
    cipher_text = '' 
    for char in user_input: #for every character in input 
     if char == ' ': 
      cipher = char 
      cipher_text += cipher 
     else: 
      cipher_num = (ord(char))+(shift)%26 #using ordinal to find the number 
      cipher= '' 
      cipher = chr(cipher_num)# using chr to convert back to a letter 
      cipher_text += cipher 
    print ("The encrypted text is:",cipher_text) 
    return(cipher_text) 


def decryption (cipher_text, shift): 
    decrypt_text = '' 
    cipher_text = '' 
    for char in cipher_text: #for every character in the encrpted text 
     decrypt_num = (ord(char))+(int(shift))%26 
     decrypt= '' 
     decrypt = chr(decrypt_num) 
     decrypt_text += decrypt 
    print("The decrypted text is:", decrypt_text) 
    return(decrypt_text) 

main() 

Répondre

1

Votre problème est dans les lignes

encryption (user_input, shift) 
    decryption (cipher_text, shift) 

comme l'exception vous dit. Si vous aviez inclus le retraçage avec votre question, ce serait très clair.

Les variables que vous déclarez dans une fonction sont locales à cette fonction. C'est une bonne chose! Il vous permet d'écrire des fonctions comme

def foo(): 
    x = 1 
    return x * x 

def bar(): 
    for x in xrange(10): 
     print "Count: %s" % x 

sans les souffler les uns les autres.

Si vous appelez une fonction qui renvoie quelque chose et vous voulez l'utiliser, vous devez l'utiliser directement, ou céder à quelque chose: dans votre cas

# assign 
x = foo() 
print x 
# use directly 
print "x is %s" % foo() 

, vous pouvez faire un changement minime affecter le résultat de encryption à une nouvelle variable cipher_text

def main(): 
     ... 
    cipher_text = encryption(user_input, shift) 
    decryption(cipher_text, shift) 

il serait équivalent (bien que moins clair) pour appeler cette autre chose

foobar = encryption(user_input, shift) 
    decryption(foobar, shift) 

ou même d'éviter l'utilisation d'une variable tout à fait

decryption(encryption(user_input, shift), shift) 
+0

'decryption' devrait retourner quelque chose. –

+0

@ArtjomB. Je n'essayais pas de fournir une révision de code, plutôt pour aider à expliquer son problème. Dans ce cas, sa fonction imprimerait toujours quelque chose, et il n'utilise pas le retour, donc j'ai évité de compliquer la réponse =) – Cireo

0

def main() devrait être def main(cipher_text) Vous peut également définir une valeur par défaut pour cipeher_text:

def main(cipher_text=""): 
    user_input = input ("Enter string: ") 
    shift = int(input ("Enter a shift that is between 1 and 26: ")) 
    while shift<1 or shift>26: 
     shift = input ("ERROR: Shift must be between 1 and 26: ") 
    encryption (user_input, shift) 
    decryption (cipher_text, shift) 
    frequency (user_input) 

Et puis il suffit d'appeler main() l'aide d'un exemple de valeur main('some value') ou tout simplement vide si vous avez défini une valeur par défaut comme dit précédemment.

+0

que le travail fait ne marche pas! L'erreur n'est plus donnée, mais la fonction de déchiffrement devient inutile. – Jane

+0

D'une certaine façon, vous devez définir cipeher_text ou ne pas l'utiliser du tout. Vous ne pouvez pas utiliser quelque chose qui n'existe pas. –

+0

Comme je l'ai dit 'def main (cipher_text =" ")' est facultatif, vous pouvez utiliser main (cipher_text) ou le laisser vide et le définir dans la fonction –