问题描述
在下面的第一个 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 的第二个输出:纽约时报在纽约市。
1楼
这里有几个问题。
你应该使用else
。
你遵循if <condition>:
和if not <condition>:
。
相反,使用其他:
if i.isalpha():
i = chr(ord(i)+num)
final.append(i)
else:
final.append(i)
这不仅是化妆品......因为你改变i
的if
块,有可能为两个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)
修复这些应该会成功生成您的原始消息。
2楼
答案很简单。 在第一个循环中,您没有对空格执行任何转换。
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)))
如果您仍有问题,请告诉我。