在 Python 中,迴文數是指任何非負整數,其數字從左到右與從右到左讀起來完全相同,而最簡潔的通用檢查方式是使用 str(n) 將整數轉換為字串,再透過切片與其反轉版本進行比較:str(n) == str(n)[::-1]。這條單行規則能涵蓋所有個位數字,識別 121、12321 和 1881 為迴文,並在同一次比對中排除 123、10 和 1000。字串反轉法速度快、可讀性高,且無需額外匯入即可在任何 Python 3 版本中運作,這也是它出現在幾乎所有入門教科書與程式面試解答中的原因。對於沒有前置零的整數輸入,字串測試在數學上等同於逐位數的數學反轉,因為兩種演算法都依賴相同的不變數:數字序列必須是迴文。其他可行的做法——使用模除與整數除法的數學反轉、雙指標比較,以及遞迴——對於格式正確的整數輸入會產生相同的布林結果,但各自對負數、尾隨零和非數字字元等邊緣情況的處理方式不同。

how to check palindrome number in python
如何在 Python 中檢查迴文數:3 種方法

什麼算是迴文數

迴文是指任何從左到右與從右到左讀起來相同的值。Merriam-Webster 以從 dad 和 1881 到 race car 以及 A man, a plan, a canal: Panama 等詞組為例子,作為定義的基準。對於純整數而言,定義會縮窄到數字層級的對稱性:121、12321、7 和 9 是迴文,而 10、123 和 1000 則不是。個位數的情況顯然成立,因為單一字元等於其自身的反轉。

一旦數字超過一位,從最左端與最右端開始的每一對位置都必須相符,逐漸向中心靠攏。這是每個 Python 實作都必須編碼的規則,無論你使用字串、整數或數字清單。布林判定回答的是是非題,但你採取的實作路徑會改變能接受哪些輸入,以及哪些邊緣情況會通過。

方法一:Python 中的字串反轉

在 Python 中撰寫迴文檢查最快速的方式,是將數字轉為字串、以切片反轉後再進行比較:

def is_palindrome(n):    return str(n) == str(n)[::-1]

切片語法 s[::-1] 以負一步階走訪字串,產生反轉的副本而不會修改原始字串。這個版本簡潔到可以放在一行,且執行時間為 O(d),其中 d 是位數。一個快速的測試如下:

print(is_palindrome(121))   # Trueprint(is_palindrome(12321)) # Trueprint(is_palindrome(123))   # Falseprint(is_palindrome(7))    # True

由於 Python 整數可任意大,此方法唯一實際的限制是記憶體與執行時間,而非位數。對於課堂練習、面試準備和快速腳本,字串反轉單行寫法是正確的預設選擇。如果你的專案要求函式名稱更明確,可以將其包裝起來:def check_palindrome_number(n): return str(n) == str(n)[::-1]。

方法二:Python 中的數學反轉

數學做法在不使用字串的情況下反轉整數。它透過模除 10 取出最後一位數,將其附加到累計總和,再以整數除以 10 從輸入中移除該位數:

def is_palindrome_math(n):    if n < 0:        return False    original = n    reversed_num = 0    while n > 0:        reversed_num = reversed_num * 10 + n % 10        n //= 10    return original == reversed_num

每次迴圈迭代會從右端剝下一個位數,並將其推入 reversed_num 的左端。當 n 達到 0 時,迴圈終止,代表所有位數皆已消耗。為了觀察演算法的運作,讓我們逐步追蹤 12321:

步驟 1:n = 12321,rev = 0。rev = 0 × 10 + 12321 mod 10 = 1,n = 1232。步驟 2:rev = 1 × 10 + 1232 mod 10 = 12,n = 123。步驟 3:rev = 12 × 10 + 123 mod 10 = 123,n = 12。步驟 4:rev = 123 × 10 + 12 mod 10 = 1232,n = 1。步驟 5:rev = 1232 × 10 + 1 mod 10 = 12321,n = 0,停止。結果:rev = 12321 = 原始值,因此 12321 是迴文。

此做法僅使用整數運算,當題目禁止字串轉換,或輸入是來自數值來源的原始整數時,特別有用。

方法三:雙指標整數比較

雙指標模式將數字儲存在清單中,並從兩端向內走訪,直到指標相遇或發現不相符為止:

def is_palindrome_pointer(n):    if n < 0:        return False    digits = [int(d) for d in str(n)]    left, right = 0, len(digits) - 1    while left < right:        if digits[left] != digits[right]:            return False        left += 1        right -= 1    return True

這種風格呼應了程式設計平台上,用於陣列與字串迴文問題的標準雙指標檢查。它會在第一次不相符時就退出,因此在非常長的輸入且不相符出現在兩端附近時,可能比完整反轉更快。權衡之處在於,你仍須負擔從 str(n) 建立數字清單的成本,所以實際上並不會比方法一快,但日後若需要忽略特定字元或跳過位置時,會更容易擴充。

Python 開發者容易忽略的邊緣情況

有幾種輸入會破壞天真的迴文檢查,而 Python 寬鬆的型別系統讓這些情況容易被忽略:

  • 負數:-121 反轉後變成 121-,這不是有效的整數,因此每種方法都應該拒絕小於零的 n。
  • 尾隨零:10、100 和 1000 並非迴文,因為要讓數字反轉後讀起來相同,必須有前置零。字串方法能正確處理這一點,因為 "10" != "01",而數學方法也同樣有效,因為反轉 10 會得到 01 = 1,而非 10。
  • 浮點數:12.21 作為字串讀起來相同,但在整數問題中很少被視為迴文。請在撰寫函式之前,先決定是否接受浮點數。
  • 含前置零的字串:"01210" 作為字串是迴文,但 int("01210") 會去除前置零並產生 1210,這就不是迴文了。若呼叫端傳入字串,請決定要保留為字串,還是先去除前置零。
  • 極大的整數:Python 原生支援處理,但對一百萬位數的數字進行字串反轉,將會配置一個龐大的暫存空間,在較小的系統上可能會超出記憶體。

對於上述每一種情況,解法都相同:在註解中說明規則、在函式開頭加入斷言,並為邊界輸入撰寫至少一個測試案例。

使用瀏覽器工具驗證 Python 輸出

能執行而無錯誤的程式碼,並不等同於正確的程式碼。在你的 Python 函式對某輸入回傳 True 或 False 之後,請將該數字貼到一個能精確顯示其比較字串的工具中。迴文檢查器可在 Python 中驗證任何迴文數,並提供可直接閱讀的標準化比較字串,且整個處理過程皆在本機端進行,無需上傳或註冊。若要將 Python 的結果與已發布的規則進行比對:

  1. 輸入你在 Python 中測試的數字或字串。
  2. 執行檢查器,並檢視用於比較的標準化字母與數字字串。
  3. 讀取判定結果與保留字元數,然後將所聲明的標準化方式與任何特定比賽的規則進行比對。

若你的 Python 程式碼回傳 True,而工具回傳 yes,則你的實作符合已發布的標準化規則。若兩者不一致,請查看工具所顯示的標準化字串,並將其追溯回你的函式:大多數的差異來自於忘記拒絕負數、錯誤處理前置零,或默默地接受了浮點數。你也可以將所保留的字元數與你 Python 中的 len() 值進行交叉檢查;若想獨立確認長度計算,Python 字串長度驗證指南會以程式碼逐步示範相同的比較過程。

Python 迴文方法比較

這三種方法對於格式正確的非負整數會產生相同的結果,但它們在風格、相依性與邊緣情況的處理方式上有所不同。

方法 可讀性 處理負數 需要字串 效能 最佳用途
字串反轉 高 需手動檢查 是 實務上最快 單行寫法、教學、預設選擇
數學反轉 中 單行防護 否 與字串相當 禁止使用字串的限制、僅限整數
雙指標 高 單行防護 是(內部使用) 可在不相符時提早結束 可擴充的檢查、略過規則

對於大多數使用情境,字串反轉單行寫法是正確的預設選擇,因為它最簡短、最易閱讀,且 Python 的切片機制使其難以寫錯。只有當題目禁止字串轉換時,才採用數學版本。當你計畫擴充檢查以略過非數字、允許浮點數,或忽略符號時,則使用雙指標模式。無論何時需要確認輸出,請將同一輸入透過迴文檢查器執行,以驗證判定結果並檢視精確的比較字串。

延伸閱讀:如何在不撰寫程式碼的情況下,於 Python 中反轉文字。