【问题标题】:I have an error, but I am not figuring out what is causing it我有一个错误,但我不知道是什么原因造成的
【发布时间】:2018-04-12 03:27:03
【问题描述】:

我正在使用以前编写的凯撒密码并将其添加到维吉尼亚密码中。我收到一个 NameError 代码,但不知道如何解决它

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

我的错误是: NameError: name 'letter' is not defined on line 21

我认为它应该从正确的函数中提取,所以应该定义字母?

【问题讨论】:

    标签: python caesar-cipher vigenere


    【解决方案1】:

    是的,确实没有定义:

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

    【讨论】:

      【解决方案2】:

      vigenere 函数中,将list1 += rotate(letter, rot) 更改为list1 += rotate(char, rot) - 该函数中没有声明letter 变量。

      顺便说一句,请确保您的缩进是正确的:您的 def main() 似乎缩进不正确。

      【讨论】: