簡體   English   中英

由於Python中有幾個頂級函數而導致語法錯誤?

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

演示: http//codepad.org/eaaiHUJZ

我還將按照以下方式重寫您的代碼:

# 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)

演示: Python 3Python 2

最后,我強烈建議您不要將這種“加密”用於需要真正安全性的任何內容。

錯誤消息確切說明了錯誤所在:

  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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM