我尝试更改我的Vigenere程序,以便输出带空格的消息。 它应该这样做: translatedMessage(' JPZFR DTZA NKC HFHOUC','多云',' 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','多云',' d')=> ' MBOAV CWLP IOB KRWJYB'
答案 0 :(得分:2)
您的代码看起来很好,但您可以注意到,无论您选择何种模式,您始终都会加密。
这是由你的
引起的if mode == 'encrypt' or 'e':
线。由于or
的{{3}}低于==
,因此会将其解析为:
if (mode == 'encrypt') or 'e':
由于mode
是' d,(mode == 'encrypt')
是False
。但由于'e'
是非空字符串,因此它在布尔上下文中求值为True
。
因此,无论您选择何种模式,(mode == 'encrypt') or 'e'
始终为True
。
您需要的是:
if mode == 'encrypt' or mode =='e':