凯撒密码和while循环问题

时间:2019-05-03 12:09:37

标签: python encryption while-loop

我正在制作这款Caesar Cipher解码器,并且我希望程序打印每个选项(可以转换的26种方式)。但是,当我运行代码时,什么都没有显示,这是我的错误。如果您知道,请告诉我,我是编码的新手,需要帮助。

import sys
import time

L2I = dict(zip("ABCDEFGHIJKLMNOPQRSTUVWXYZ",range(26)))
I2L = dict(zip(range(26),"ABCDEFGHIJKLMNOPQRSTUVWXYZ"))

msg = ("What is the intercepted message \n")
for character in msg:
  sys.stdout.write(character)
  sys.stdout.flush()
  time.sleep(0.1)
msg_ans = input("> ")
msg_ans = msg_ans.strip()

shift = 0
def decipher(msg_ans,shift): 
  while shift < 26: 
    for i in msg_ans.upper():
      if i.isalpha() == True : 
        msg_ans += I2L[ (L2I[i]+ shift)%26 ]
        shift += 1
      else: 
        msg_ans += i
        shift += 1 
  print (msg_ans)
decipher(msg_ans,shift)

我希望它能输出26种可以移动的方式。但是,当我使用“ Hello”一词时,我得到的是“ HelloHFNOSMKSTXRQZBGWUCDHBAJLQLKTVAVVFIO”,而不是“ IFMMP JGNNQ ...”

2 个答案:

答案 0 :(得分:0)

味精应该是这样的

msg = "What is the intercepted message \n"

您可能还想在这里打印而不是返回

return msg_ans

答案 1 :(得分:0)

有两个问题。首先,每次检查单个字符时,您就递增shift。实际上,您只想在每次循环遍历消息后增加它。您还应该将初始化移动到函数中。没有理由传递shift,因为您只是按顺序尝试了所有26种可能性。

def decipher(msg_ans): 
    shift = 0
    while shift < 26: 
        for i in msg_ans.upper():
            if i.isalpha() == True : 
                msg_ans += I2L[ (L2I[i]+ shift)%26 ]
            else: 
                msg_ans += i
        shift += 1
    print (msg_ans)

但是,在这一点上,没有理由使用while循环而不是for

def decipher(msg_ans): 
    for shift in range(26): 
        for i in msg_ans.upper():
            if i.isalpha() == True : 
                msg_ans += I2L[ (L2I[i]+ shift)%26 ]
            else: 
                msg_ans += i
    print (msg_ans)

另一个问题是,您只是将新字符附加到输入字符串的末尾。您没有指定您实际想要的形式,所以假设您希望在字符串列表中使用它。您需要初始化列表,在每次迭代时构建一个临时字符串,然后将临时字符串附加到列表中:

def decipher(msg_ans): 
    possible_messages = []
    for shift in range(26): 
        decoded_msg = ''
        for i in msg_ans.upper():
            if i.isalpha() == True : 
                decoded_msg += I2L[ (L2I[i]+ shift)%26 ]
            else: 
                decoded_msg += i
        possible_messages.append(decoded_msg)
    return possible_messages

然后仅打印调用该函数的结果:

 print(decipher(msg_ans))