我尝试更改我的Vigenere程序,以便它可以输出带有空格的消息。应该这样做: translatedMessage('JPZFR DTZA NKC HFHOUC','cloudy','d') =>‘来自未来的问候’
def translateMessage(message, key, mode):
translated = ''
alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
keyIndex = 0
message = message.upper()
key = key.upper()
for symbol in message:
xyz = alphabet.find(symbol.upper())
if xyz != -1:
if mode == 'encrypt' or 'e':
xyz += alphabet.find(key[keyIndex]) + 1
elif mode == 'decrypt' or 'd':
xyz -= alphabet.find(key[keyIndex]) + 1
xyz %= len(alphabet)
if symbol.isupper():
translated += alphabet[xyz]
elif symbol.islower():
translated += alphabet[xyz].lower()
keyIndex += 1
if keyIndex == len(key):
keyIndex = 0
else : translated += symbol #this will add space as it is
return translated取而代之的是: translatedMessage('JPZFR DTZA NKC HFHOUC','cloudy','d') => 'MBOAV CWLP IOB KRWJYB‘
发布于 2018-02-20 00:37:21
您的代码看起来基本上没问题,但您可以注意到,无论您选择哪种模式,您都会进行加密。
这是由您的
if mode == 'encrypt' or 'e':线路。因为or的operator precedence比==低,所以它被解析为:
if (mode == 'encrypt') or 'e':因为mode是'd',所以(mode == 'encrypt')是False。但由于'e'是一个非空字符串,因此在布尔上下文中它的计算结果为True。所以,无论你选择哪种模式,(mode == 'encrypt') or 'e'都是True。
您需要的是:
if mode == 'encrypt' or mode =='e':https://stackoverflow.com/questions/48870171
复制相似问题