我尝试更改我的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
复制相似问题