[英]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.