凯撒密码 Python

Caesar Cipher Python

在下面的第一个 For 循环中,代码成功地将字母向右移动了 num 位。问题出在第二个 For 循环中,它并没有像预期的那样完全反转它。我在下面包含了输出。任何意见,将不胜感激。谢谢

def cipher(message):
num = int(input())
final = []
finalReverse = []
for i in message:
        if i.isalpha():
                i = chr(ord(i)+num)
                final.append(i)
        if not i.isalpha():
                final.append(i)
final = ''.join(map(str, final))
print(final)
for i in final:
        if chr(ord(i)-num).isalpha:
                x = chr(ord(i)-num)
                finalReverse.append(x)
        if not chr(ord(i)).isalpha:
                finalReverse.append(char(ord(i)))
finalReverse = ''.join(map(str, finalReverse))
print(finalReverse)

密码("The New York Times is in New York City.")

输出: (我输入数字 3 作为数字)

第一个 For 循环的输出:Wkh Qhz \运行 Wlphv lv lq Qhz \运行 Flw||.

第二个 For 循环的输出:TheNewYYorkTimesisinNewYYorkCityy+

预期第 2 个 For 循环的输出:纽约时报在纽约市。

答案很简单。在第一个循环中,您没有对空格执行任何转换。

if not i.isalpha(): 
    final.append(i)

但是在第二个循环中,您试图在附加到解密列表之前转换空格。

if not chr(ord(i)-num).isalpha:           
    finalReverse.append(x)

此外,您再次附加了 x,它是来自较高条件的值。

finalReverse.append(x)

您只需附加原始值即可。

if not chr(ord(i)).isalpha: 
    finalReverse.append(char(ord(i)))

如果您还有问题,请告诉我。

这里有几个问题。

你应该使用 else.

您用 if not <condition>: 关注了 if <condition>:。相反,使用 else:

if i.isalpha():
    i = chr(ord(i)+num)
    final.append(i)
else:
    final.append(i)

这不仅仅是装饰性的...因为您在 if 块中更改了 i,所以 bothifif not 在单次迭代中阻塞到 运行。使用 else 解决了这个问题(无论如何都是更好的风格)。

你忘记在解密部分调用isalpha

您需要在解密部分的 isalpha 调用末尾添加括号,否则只有 if 块会 运行(因为方法或函数对象是总是被认为是正确的)。

if chr(ord(i)-num).isalpha():
    ...

您在解密 else 循环中使用了错误的变量

您将 x 附加到解密部分 else 块中的列表,但 x 仅在 if 块中有意义。使用 i.

if chr(ord(i)-num).isalpha():
    x = chr(ord(i)-num)
    finalReverse.append(x)
else:
    finalReverse.append(i)

修复这些应该会成功生成您的原始消息。