凯撒密码加密,无法打印最终消息

时间:2018-11-25 11:48:04

标签: python caesar-cipher

mobilenumber datekey     amount      code
------------ ----------- ----------- ----
1            1           10          cre
1            1           10          cre
1            2           10          cre
1            2           10          deb
1            3           10          deb
1            3           10          cre

(6 row(s) affected)

id          date
----------- -----------------------
1           2017-01-01 00:00:00
2           2017-01-02 00:00:00
3           2017-01-03 00:00:00

(3 row(s) affected)

select t.mobilenumber,
        sum(case when code = 'cre' then amount else 0 end) sumcre,
        sum(case when code = 'deb' then amount else 0 end) sumdeb,
        min(date) mindate,
        max(date) maxdate
from 
    (
    select t.*,d.date from t join dimtime d on d.id = t.datekey and t.code = 'cre'
    union 
    select t.*,null from t join dimtime d on d.id = t.datekey and t.code = 'deb'
        ) t
group by t.mobilenumber

mobilenumber sumcre      sumdeb      mindate                 maxdate
------------ ----------- ----------- ----------------------- -----------------------
1            30          20          2017-01-01 00:00:00     2017-01-03 00:00:00
Warning: Null value is eliminated by an aggregate or other SET operation.

(1 row(s) affected)

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

2 个答案:

答案 0 :(得分:1)

之所以这样,是因为您没有在外部分配pd.crosstab(test.cluster,test.type,normalize='index',margins=True).plot(kind='bar') 变量。在answer1方法中,您已将值分配给其作用域本地的变量,而不是您想要的外部作用域中的message()变量。

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

类似地,getMessage()无法访问超出其范围的变量。因此,您也必须将它们作为参数传递!

此代码的正确形式如下:

answer1

以上这段代码将创建一个列表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()

请确保您保持正确的范围,并且您会做得很好。 This文章以很好的方式进行了解释。

答案 1 :(得分:1)

只需对原始代码进行最少的更改,即可使用工作代码

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。因此,return语句中的int(key)

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

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

  5. 我移动了命令

    lengthList = []
    leng = 0
    

    进入函数getMessage()的定义。

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

  7. 您希望将结果打印为 string ,而不是单个字符的list-因此,我使用"".join(lengthList)命令将该列表更改为字符串。 (空字符串""用作单个连接字母之间的分隔符,因此它们将被连接而没有空格或其他符号。)

  8. 然后我删除了所有多余的(无用的)语句。