Python - 试图编写一个不忽略空格的 vigenere 密码
Python - Tried to write a vigenere cipher that doesn't ignore spaces
我试图更改我的 Vigenere 程序,以便它输出带空格的消息。
它应该这样做:
translatedMessage('JPZFR DTZA NKC HFHOUC', 'cloudy', 'd') => 'HELLO FROM THE FUTURE'
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'
您的代码看起来基本没问题,但您会注意到无论选择何种模式,您总是加密。
这是由于您的
if mode == 'encrypt' or 'e':
行。因为 or
的 operator precedence 比 ==
低,所以它被解析为:
if (mode == 'encrypt') or 'e':
由于 mode
是 'd',(mode == 'encrypt')
是 False
。但由于 'e'
是一个 non-empty 字符串,它在布尔上下文中的计算结果为 True
。
因此,无论您选择哪种模式,(mode == 'encrypt') or 'e'
始终是 True
。
您需要的是:
if mode == 'encrypt' or mode =='e':
我试图更改我的 Vigenere 程序,以便它输出带空格的消息。 它应该这样做: translatedMessage('JPZFR DTZA NKC HFHOUC', 'cloudy', 'd') => 'HELLO FROM THE FUTURE'
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'
您的代码看起来基本没问题,但您会注意到无论选择何种模式,您总是加密。
这是由于您的
if mode == 'encrypt' or 'e':
行。因为 or
的 operator precedence 比 ==
低,所以它被解析为:
if (mode == 'encrypt') or 'e':
由于 mode
是 'd',(mode == 'encrypt')
是 False
。但由于 'e'
是一个 non-empty 字符串,它在布尔上下文中的计算结果为 True
。
因此,无论您选择哪种模式,(mode == 'encrypt') or 'e'
始终是 True
。
您需要的是:
if mode == 'encrypt' or mode =='e':