2017-10-31 2 views
2

Ich nehme eine zuvor geschriebene Caesar-Chiffre und fügen Sie es zu einem vigenere Chiffre. Ich bin einen Nameerror Code bekommen und weiß nicht, wie esIch habe einen Fehler, aber ich bin nicht herauszufinden, was es verursacht

def alphabet_position(letter): 
    alphabet_pos = {'A':0, 'a':0, 'B':1, 'b':1, 'C':2, 'c':2, 'D':3, 
        'd':3, 'E':4, 'e':4, 'F':5, 'f':5, 'G':6, 'g':6, 
        'H':7, 'h':7, 'I':8, 'i':8, 'J':9, 'j':9, 'K':10, 
        'k':10, 'L':11, 'l':11, 'M':12, 'm':12, 'N': 13, 
        'n':13, 'O':14, 'o':14, 'P':15, 'p':15, 'Q':16, 
        'q':16, 'R':17, 'r':17, 'S':18, 's':18, 'T':19, 
        't':19, 'U':20, 'u':20, 'V':21, 'v':21, 'W':22, 
        'w':22, 'X':23, 'x':23, 'Y':24, 'y':24, 'Z':25, 'z':25 } 
    pos = alphabet_pos[letter] 
    return pos 


def rotate(letter, rot): 
    shift = 97 if letter.islower() else 65 
    return chr((ord(letter) + rot - shift) % 26 + shift) 

def vigenere(msg, rot): 
    list1 = "" 
    for char in msg: 
     list1 += rotate(letter, rot) 
    return list1 

def main(): 
    letter = input('Enter a letter: ') 
    rot = int(input('Enter a number: ')) 
    print(alphabet_position(letter)) 
    print(rotate(letter,rot)) 
    x = input("Type a message: ") 
    y = input("Rotate by: ") 
    result = vigenere(x, y) 
    print (result) 

if __name__ == '__main__': 
    main() 

Mein Fehler zu beheben ist: NameError: name 'letter' is not defined on line 21

Ich dachte, es von der korrekten Funktion ziehen sollte, so sollte der Brief definiert werden?

Antwort

0

Ja, ist es nicht in der Tat definiert:

def vigenere(msg, rot): 
    list1 = "" 
    for char in msg: 
     list1 += rotate(char, rot) #<-- change to char 
    return list1 
0

In der vigenere Funktion, ändern Sie list1 += rotate(letter, rot) zu list1 += rotate(char, rot) - es gibt keine letter Variable in dieser Funktion deklariert.

Nebenbei stellen Sie sicher, dass Ihre Einrückung korrekt ist: Ihre def main() scheint falsch eingerückt.

Verwandte Themen