【问题标题】:Caesar Cipher Encrypt, can't print final message凯撒密码加密,无法打印最终消息
【发布时间】:2018-11-25 11:48:03
【问题描述】:
def message():
    answer1 = input('Welcome to the Caesar Cipher! What do you want to encrypt?')
    key = input('Enter the key number that you want to encrypt with. (1 - 26)')


def getMessage():
    while leng <= lengthOfInput1-1:
        lengthList.append(chr(ord(answer1[len]) + key))
        len += 1
    print(lengthList)


key = 0
answer1 = ''
maxKeySize = 26
lengthOfInput1 = len(answer1)
leng = 0
lengthList = []
message()
getMessage()

当我运行这段代码时,我总是得到“[]”的答案。我不知道发生了什么,并认为变量“lengthList”是一个列表并且会附加字母。我还需要帮助将各个字母组合在一起以形成加密消息。 谢谢,埃里克

【问题讨论】:

  • 你只在函数中改变answer1key。这些值与您在外部范围中定义的answer1key 无关。使用return 从函数中返回这些值。在函数中,您将拥有 return (answer1, key),并且您必须使用 answer1, key = message() 调用该函数。

标签: python caesar-cipher


【解决方案1】:

这是因为您没有在外部分配 answer1 变量。在 message() 方法中,您已将值分配给其作用域的局部变量,而不是您想要的外部作用域中的 answer1 变量。

您必须将它作为参数传递,并返回它的值,以便它保留它的值。

同样,getMessage() 不能访问超出其范围的变量。因此,您也必须将它们作为参数传递!

此代码的正确形式如下:

def message():
    answer1 = input('Welcome to the Ceaser Cipher! What do you want to encrypt?')
    key = int(input('Enter the key number that you want to encrypt with. (1 - 26)'))
    return answer1, key


def getMessage(lengthOfInput1, lengthList, answer1, key, leng):
    while leng <= lengthOfInput1-1:
        lengthList.append(chr(ord(answer1[leng]) + key))
        leng += 1
    print(lengthList)


key = 0
answer1 = ''
answer1, key = message()
# Here I am returning both of the values from
# message method.

# LOCAL VARIABLES
maxKeySize = 26
lengthOfInput1 = len(answer1)
leng = 0
lengthList = []

getMessage(lengthOfInput1, lengthList, answer1, key, leng)
# Inorder to access the local variables, you will
# have to pass them to getMessage() method.

上面的这段代码将创建一个列表lengthList,其中包含密码的字母。但是,它是 getMessage() 的本地地址。您必须将其返回到它的父范围,才能在那里访问它。

此外,要将列表转换为字符串,您必须在列表中进行迭代,并继续追加到空字符串。像这样的:

messageCoded = ""
for i in messageList:
    messageCoded += i

print(messageCoded)

确保你保持范围正确,你会做得很好。 This文章解释的很好。

【讨论】:

    【解决方案2】:

    只需对原始代码进行少量更改,即可工作代码

    def message():
        answer = input('Welcome to the Ceaser Cipher! \nWhat do you want to encrypt? ')
        key = input('Enter the key number that you want to encrypt with (1 - 26): ')
        return answer, int(key)
    
    
    def getMessage(answer, key):
        lengthList = []
        leng = 0
        while leng < len(answer):
            lengthList.append(chr(ord(answer[leng]) + key))
            leng += 1
        print("".join(lengthList))
    
    
    answer, key = message()
    getMessage(answer, key)
    

    解释:

    1. 您的message() 函数用用户输入填充answer1key 变量,然后将它们扔掉,因为这些只是本地变量- answer1key 在这个函数的定义之外是 others 变量。 所以我添加了return 命令来保存它们(并将answer1 重命名为answer)。

    2. message() 函数中键变量的类型是 str(字符串),但您需要 int。所以返回语句中的int(key)

    3. 在主代码中,我保存了这些返回值 - answer, key = message() 命令。

    4. 您的函数 getMessage() 需要这些值,所以我将它们作为参数添加到它 - def getMessage(answer, key):

    5. 我移动了命令

      lengthList = []
      leng = 0
      

      进入函数getMessage()的定义。

    6. 我将您的 while leng &lt;= lengthOfInput1-1: 命令更改为 while leng &lt; len(answer): - 注意 &lt; 而不是 &lt;=

    7. 您想要打印一个字符串,而不是单个字符的list - 所以我使用"".join(lengthList) 命令将该列表更改为字符串。 (空字符串"" 用作各个连接字母之间的分隔符,因此它们将在没有空格或其他符号的情况下连接。)

    8. 我删除了所有多余(无用)的陈述。

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 1970-01-01
      • 2013-03-13
      • 2014-04-11
      • 2016-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      相关资源
      最近更新 更多