凯撒密码 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
,所以 both 和 if
和 if 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)
修复这些应该会成功生成您的原始消息。
在下面的第一个 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
,所以 both 和 if
和 if 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)
修复这些应该会成功生成您的原始消息。