![](/img/trans.png)
[英]Memoization of recursive functions in Python, but only for the duration of the top-level call
[英]syntax error due to several top-level functions in Python?
我尝试在python中定义多个函数时搜索并在此处发现一个非常类似的问题语法错误?
但问题并未得到真正的回答
我在第二个“ def”处收到语法错误。 我的缩进可能在这里弄乱了,因为我无法弄清这里的格式...。但是在我的程序中它是正确的,缩进不是问题。
def encryptChar(ch, key):
newOrd = ord(ch) + key % 26
if ord(ch) < 65:
newOrd = ord(ch)
elif ord(ch) < 91:
if newOrd > 90:
newOrd = newOrd - 26
elif newOrd > 122:
newOrd = newOrd - 26
newch = chr(newOrd)
return newch
def encryptString(string, key):
newString = ""
for i in range(len(string)):
newString += encryptChar(string[i], key)
return newString
def decryptString(string, key):
newString = ""
for i in range(len(string)):
newString += encryptChar(string[i], -1*key)
return newString
我正在猜测,这与所有功能都处于顶层有关。 但是我该如何解决? 这是Python 2.7。 (我可以将top函数包含在其他2个函数中,但是我仍然剩下2个顶层函数)
谢谢你的帮助!
修复缩进错误后,我就可以毫无问题地运行您的代码:
def encryptString(string, key):
newString = ""
for i in range(len(string)):
newString += encryptChar(string[i], key)
return newString # << HERE
我还将按照以下方式重写您的代码:
# because encryption is misnomer here
def rotateChar(ch, key):
if 'a' <= ch < 'z':
newOrd = (ord(ch) - ord('a') + key) % 26
return chr(newOrd + ord('a'))
elif 'A' < ch < 'Z':
newOrd = (ord(ch) - ord('A') + key) % 26
return chr(newOrd + ord('A'))
else:
return ch
def rotateString(st, key):
return ''.join(rotateChar(c, key) for c in st)
def derotateString(st, key):
return ''.join(rotateChar(c, -key) for c in st)
最后,我强烈建议您不要将这种“加密”用于需要真正安全性的任何内容。
错误消息确切说明了错误所在:
File "test.py", line 17
return newString
^
IndentationError: unindent does not match any outer indentation level
在return newString
的行上,缩进级别与for i in range(len(string))
行中for i in range(len(string))
的先前缩进级别不匹配。
您需要整体修复缩进-在所有代码中使用恒定的缩进级别(例如2或4个空格)。 始终如一。 现在,您的缩进无处不在–每次缩进时,缩进到一个不同的水平。
其次,不要将名称string
用于变量。 string
也是标准Python模块的名称,因此您将无法在代码中使用该模块,并且会混淆其他人阅读您的代码(也不要使用str
,因为这是内置名称功能)。
在您的函数开始时没有出现语法错误,但在它的结尾...
def encryptString(string, key):
newString = ""
for i in range(len(string)):
newString += encryptChar(string[i], key)
return newString
您的return
语句比该函数的其余部分缩进一个空格,从而导致IndentationError。
如果您确定错误出现在代码的开头,则还有另一种可能性。 堆栈溢出会自动将制表符转换为您发布的代码中的空格。 如果您混合使用制表符和空格,则可能是创建了一个缩进错误,您看不到它。 如果您不想尝试手动修复它,则大多数文本编辑器都将具有为您提供标签的功能,即您可以用空格替换选项卡,或者您也可以将代码从帖子中复制回程序。
问题是return newString
的缩进级别为4个字符,该缩进级别与该级别的前一行3个字符不匹配。 尝试使用可以让您轻松地始终键入4空格制表符的编辑器; 如果您必须手工整理所有内容并不断遇到此类错误,那么编写Python将会非常痛苦。
我不知道这是否是复制和粘贴错误,但是您的缩进有点混乱。 尝试使用我的,看看是否有相同的问题:
def encryptChar(ch, key):
newOrd = ord(ch) + key % 26
if ord(ch) < 65:
newOrd = ord(ch)
elif ord(ch) < 91:
if newOrd > 90:
newOrd = newOrd - 26
elif newOrd > 122:
newOrd = newOrd - 26
newch = chr(newOrd)
return newch
def encryptString(string, key):
newString = ""
for i in range(len(string)):
newString += encryptChar(string[i], key)
return newString
def decryptString(string, key):
newString = ""
for i in range(len(string)):
newString += encryptChar(string[i], -1*key)
return newString
您收到的错误信息是什么? 您的函数名称不应该冲突。 我的猜测是, return
之前的多余空间给您带来了问题,但是这将有助于查看错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.