无法获得 Caesar Cypher 所需的输出

问题描述 投票:0回答:3

我正在尝试为 Caesar Cypher 创建一个函数,使用

ord()
函数将任何字符串转换为其各自的 unicode,然后将 unicode 移动两步。

例如,字符串“a”的 unicode 是整数 97。

print(ord('a'))

之后,这个移位后的 unicode 被转换回其各自的字符,产生一段难以理解的代码。

。回溯(最近一次调用最后一次): 文件“main.py”,第 11 行,位于 密码(消息) Ccypher 中的文件“main.py”,第 9 行 a = a + str(chr(lst[i])) UnboundLocalError:赋值前引用局部变量“a”**

我尝试通过添加将 a 转换为全局变量

global a
在函数体内,但后来我没有输出,只是空白。

我写的代码如下:

lst = list()
a = ''
msg = "Meet me at the Ritz Carlton at 9 o'clock, don't be late!" #message to encrypt

def Ccypher(string, shift = 2):
    for i in range(len(msg)):
        lst.append(ord(msg[i]) + shift)
        a = a + str(chr(lst[i]))
    return a
Ccypher(msg)
python encryption unicode caesar-cipher list-manipulation
3个回答
0
投票

在我的机器上,添加了

global a
后,
Ccypher(msg)
的返回值不为空:
'Oggv"og"cv"vjg"Tkv|"Ectnvqp"cv";"q)enqem."fqp)v"dg"ncvg#'
。您可能只是忘记打印它


0
投票

如前所述,所有变量都应该在函数内部声明,这里不需要全局变量(这通常是不好的做法)。

并且只需打印函数返回的最终结果,否则它会被计算但会丢失:

def Ccypher(string, shift = 2):
    lst = list()
    a = ''
    for i in range(len(msg)):
        lst.append(ord(msg[i]) + shift)
        a = a + str(chr(lst[i]))
    return a

msg = "Meet me at the Ritz Carlton at 9 o'clock, don't be late!" #message to encrypt

print(Ccypher(msg))

PS 原版 Caesar Cypher 移位了 3 个字母


0
投票

无需全局变量即可轻松解决问题。您需要在循环之前在函数体中声明变量,您还需要不仅调用该函数,还需要打印其结果:

msg = "Meet me at the Ritz Carlton at 9 o'clock, don't be late!" #message to encrypt

def Ccypher(string, shift = 2):
    a = ''
    lst = list()
    for i in range(len(msg)):
        lst.append(ord(msg[i]) + shift)
        a = a + str(chr(lst[i]))
    return a
print(Ccypher(msg))

请注意,您的“密码”不是真正的凯撒密码。凯撒密码应仅对字母进行编码(在本例中,是针对字母,而不是其他符号),不包括标点符号和数字

© www.soinside.com 2019 - 2024. All rights reserved.