2017-03-15 32 views
1

私の暗号化コードでは、次の関数で使用されているので、関数から値を返そうとしています。私は 'cipher_text'という名前が定義されていないと私に伝えて、エラーを取得し続けます。助けてください!Python関数 - 戻り値が '定義されていません'

エラー:

(7行目)

解読(cipher_text、シフト)

NameError:名 'cipher_text' が

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() 

答えて

1

あなたの問題はライン

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

例外がわかりますよう

です。あなたがあなたの質問にトレースバックを含めていたなら、これは非常に明確です。

1つの関数で宣言した変数は、その関数にとってローカルです。これは良いことです!

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

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

のような関数を書くことができます。あなたが何かを返す関数を呼び出すと、あなたはそれを使用したい場合は

、あなたはそれを直接使用したり、何かに割り当てる必要があります:あなたのケースで

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

、あなたはに最小限の変更を行うことができます他に、この何かを呼び出すこと(ただしそれほど明確)と等価になり、新たな変数cipher_text

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

encryptionの結果を割り当てる

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

かさえ全く

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

'decryption'が何かを返す必要があります。 @ArtjomB。 –

+0

彼の問題を説明するのではなく、コードレビューを提供しようとしていませんでした。この場合、彼の関数はまだ何かを印刷し、彼は戻り値を使わないので、答えを複雑にするのを避けました=) – Cireo

0

def main()が定義されていないあなたdef main(cipher_text) する必要があります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) 
そして単なる値の例を使用して main()を呼び出す main('some value')か、前に言ったようにデフォルト値を定義した場合だけ、空。

+0

実際にdoesntの仕事を変数の使用を避けるために!エラーはもはや与えられませんが、復号化機能は役に立たなくなります。 – Jane

+0

何らかの理由でcipeher_textを定義するか、まったく使用しないでください。存在しないものは使用できません。 –

+0

私は 'def main(cipher_text =" ")はオプションであると言っていたので、main(cipher_text)を使うか空白にして関数内で定義することができます –

関連する問題