尝试创建 ROT13 解码器时发现一个我不太明白的错误

Trying to create a ROT13 decoder and I found an error I don't quite understand

总的来说,我对编码世界还很陌生,在完成最近一个以密码学为主题的 Codecademy 项目后,我受到启发尝试使用类似的设置创建我自己的 ROT13 解码器,因为我已经看到 ROT13 使用在我经常光顾的一些粉丝网站上有很多,以掩盖剧透。我写的代码如下:

ABCs = "abcdefghijklmnopqrstuvwxyz"
punctuation = ".,?'! "
user_input = input("Enter message to be decoded: ")

def ROT13_decode(message):
    translation = ""
    for letter in message:
        if not letter in punctuation:
            letter_value = ABCs.find(letter)
            translation += ABCs[(letter_value + 13)]
        else:
            translation += letter
    return translation

print(ROT13_decode(user_input))

然而,在调试时,我得到了以下错误信息:

line 10, in ROT13_decode
    translation += ABCs[(letter_value + 13)]
IndexError: string index out of range

当只有 26 个字母可供使用时,我不知道我的字符串索引怎么会超出范围。我错过了什么?

当您将 13 添加到您的字母值时,您必须能够将结果循环回字母表的开头,这是使 ROT13 工作的全部技巧。如果您将翻译代码更改为:

translation += ABCs[(letter_value + 13) % 26]

字母表的上半部分通常会为您提供一个大于 ABCs 长度的值,但保证始终小于 26。