我正在尝试为 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)
在我的机器上,添加了
global a
后,Ccypher(msg)
的返回值不为空:'Oggv"og"cv"vjg"Tkv|"Ectnvqp"cv";"q)enqem."fqp)v"dg"ncvg#'
。您可能只是忘记打印它
如前所述,所有变量都应该在函数内部声明,这里不需要全局变量(这通常是不好的做法)。
并且只需打印函数返回的最终结果,否则它会被计算但会丢失:
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 个字母
无需全局变量即可轻松解决问题。您需要在循环之前在函数体中声明变量,您还需要不仅调用该函数,还需要打印其结果:
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))
请注意,您的“密码”不是真正的凯撒密码。凯撒密码应仅对字母进行编码(在本例中,是针对字母,而不是其他符号),不包括标点符号和数字