关于Python中Caesar密码的Caesar密码问题

关于Python中Caesar密码的Caesar密码问题,python,encryption,caesar-cipher,Python,Encryption,Caesar Cipher,我的解码功能工作正常,但我的编码功能直到最后一个字母都很好。当计算出来时,它应该显示“uryyb”表示hello,而不是“uryyl”。这是我的密码: def encode(w, o): result = "" w = w.lower() for i in w: letter = ord(i) if ord('a') <= letter <= ord('z'): new_letter = letter

我的解码功能工作正常,但我的编码功能直到最后一个字母都很好。当计算出来时,它应该显示“uryyb”表示hello,而不是“uryyl”。这是我的密码:

def encode(w, o):

    result = ""
    w = w.lower()

    for i in w:
        letter = ord(i)
        if ord('a') <= letter <= ord('z'):
            new_letter = letter + (o % 26)
            if new_letter < 26:
                new_letter += 26
            result += chr(new_letter)

        else:
            result += chr(letter)

    return result
def编码(w,o):
result=“”
w=w.下()
对于w中的i:
字母=ord(i)

如果你已经走到一半了。您处理了
如果新字母<26
,但没有处理
新字母>26


编辑:顺便说一下,看看ord(i)返回的值。您会注意到26不是要检查的正确数字,假设
o
是移位数。您需要确保ord在
a
z
之间

    # truncate overflowing
    while new_letter < ord("a"):
        new_letter += 26
    # however, case above never shows up. Why?
    while new_letter > ord("z"):
        new_letter -= 26
    result += chr(new_letter)

o%26
做什么?@MaartenBodewes模运算对于任何做过大量编程的人来说都应该很熟悉,并且在任何基本的Python简介中都很容易找到。@tripleee确实,这就是我问的原因
o%26
没有意义,它将
o
中的偏移量转换为0..25
。如果
o`是一个字符,则基本上会返回一个随机值(因为它取决于字符的偏移量
a
)。如果它是一个数字,那么它应该只返回一个错误,你不想接受-27或1000作为一个键。那么,一个提示?那么,也许可以这样标记它;很多时候,评论者都会要求澄清他们懒得弄清楚某事的含义。@MaartenBodewes我想这是一个轮班数字。更好的数字是ord(“a”)还是97?我想我是在检查ord(I)是否在a和z之间。它永远不会小于“a”,因为对于字母来说,小写的“a”是我认为的最低值。如果我错了,请纠正我。谢谢你的帮助@丽芙:如果有帮助的话,你可以投票或接受我的回答。谢谢
>> ord("a") # the base is not 26!
97