HOWTO · Python
修復 Python 在函式外部返回的錯誤
如何修復 Python 在函式外部返回的錯誤。
本頁內容
如果 Python 顯示 SyntaxError: 'return' outside function,請將 return 陳述式移入函式本體。Python 會在解析檔案時拒絕位於模組層級的 return,因此程式尚未執行就會出錯。請檢查縮排及周圍的 def 區塊;在頂層程式碼中,應呼叫函式並使用它的回傳值。
了解 return outside function 錯誤
return 關鍵字會將值從目前的函式傳回給呼叫該函式的程式碼。從語法上來說,return 只能出現在函式本體內。如果 return 陳述式出現在模組層級,Python 就會引發 SyntaxError,並顯示訊息 'return' outside function。
Python 會在執行程式前先解析整個檔案。因此,位於頂層的 return 會讓檔案中較早的陳述式也無法執行。錯誤訊息會指向 return 那一行,但原因可能是後面某處的陳述式放錯位置,或縮排讓函式區塊比預期更早結束。例如,以下無效的頂層陳述式 return 10 會產生這個解析錯誤:
SyntaxError: ‘return’ outside function
將 return 移入函式
請將陳述式放在函式內與其他陳述式相同的縮排層級,接著從模組層級的程式碼呼叫該函式。執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
def calculate_total(price, quantity):
return price * quantity
print(calculate_total(8, 3))
24
在這裡,return price * quantity 屬於 calculate_total,而函式呼叫會將 8 和 3 作為引數傳入。接著,回傳值會傳給 print。請依照自己的函式需求,替換計算式和引數。
條件區塊或迴圈本身不會建立函式。只有當 if、for 或 while 區塊位於函式內時,才能在其中使用 return。以下補充示例在語法上有效,但未納入提供的執行證據:
def first_match(items):
for item in items:
if item == "target":
return item
return None
print(first_match(["other", "target", "later"]))
return item 這一行同時位於函式和 if 區塊內。找到符合條件的項目時,它會立即結束 first_match,因此函式呼叫會將 "target" 傳給 print。如果沒有符合的項目,就會執行最後的 return None;函式執行到結尾卻沒有 return 時,也會隱含地回傳 None。
檢查縮排與函式定義
Python 會根據縮排判斷哪些陳述式屬於函式。與 def 對齊的程式行位於函式外;縮排在它下方的程式行則屬於函式本體。如果在 def get_value(): 後立即取消縮排,函式就沒有本體,因此 Python 會回報縮排錯誤,而不是 SyntaxError: 'return' outside function。若要產生這裡討論的錯誤,先在函式中加入有效的本體陳述式,例如 pass,再將 return 5 放在最左側;此時最後一行便是位於頂層的 return。修正後的寫法會讓 return 5 縮排在 def get_value(): 之下。請使用一致的縮排方式,通常是四個空格,並檢查錯誤位置前面的程式行,找出函式區塊在哪裡結束。
也請確認函式標頭語法正確,並以冒號結尾。例如,my_function(): 因為缺少 def 而格式錯誤;Python 會針對該標頭回報語法錯誤,而不會將它視為函式,再把其中的 return 判定為位於函式外。標頭拼錯或不完整,也可能造成不同的錯誤訊息。請先修正標頭,再確認 return 那一行縮排在標頭之下。診斷時最重要的是確認該陳述式是否確實位於函式本體內。
在模組層級呼叫函式
模組層級程式碼是 Python 檔案中不屬於任何函式或類別的部分。它可以呼叫函式、將函式的回傳值指定給變數,再顯示或使用該值。例如,請寫成 answer = calculate_total(8, 3),再使用 answer;不要在模組層級寫 return calculate_total(8, 3)。
除錯時,請檢查 Python 指出的程式行,以及該行相對於最近 def 的縮排。如果該行已有縮排,請找找前面是否有較早取消縮排的程式行,提早結束了函式本體。如果函式定義本身格式錯誤,請分開修正該語法。確認 return 位於預期的函式內後,再從周圍的模組層級程式碼呼叫函式。這能清楚區分從函式回傳值,以及在程式其他部分使用該值。