当前位置: 代码迷 >> python >> 凯撒密码 Python
  详细解决方案

凯撒密码 Python

热度:106   发布时间:2023-07-16 11:21:31.0

在下面的第一个 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)

cipher("纽约时报在纽约市。")

输出:(我为 num 输入了数字 3)

第一个 For 循环的输出:Wkh Qhz \\run Wlphv lv lq Qhz \\run Flw||。

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

预计 For Loop 的第二个输出:纽约时报在纽约市。

这里有几个问题。

你应该使用else

你遵循if <condition>:if not <condition>: 相反,使用其他:

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

这不仅是化妆品......因为你改变iif块,有可能为两个ifif 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)

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

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

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

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

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

此外,您再次附加 x ,这是来自 upper condition 的值。

finalReverse.append(x)

而不是这个,你只需要附加原始值。

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

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