关于Python中Caesar密码的Caesar密码问题
我的解码功能工作正常,但我的编码功能直到最后一个字母都很好。当计算出来时,它应该显示“uryyb”表示hello,而不是“uryyl”。这是我的密码:关于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
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