如何在 Python 中使用 Switch:包含範例和替代方案的權威指南

最後更新: 8的胡里奧·德2025
  • Python 中不存在傳統的 switch,但可以透過條件和字典有效地模擬。
  • 從 Python 3.10 開始,新的 match-case 結構透過取代經典的 switch-case 帶來了增強的功能和可讀性。
  • 各種技術可讓您在 Python 中實現多項選擇邏輯,以適應不同的場景和語言版本。

Python 中的 Switch 範例

你是否曾想過如何在 Python 中簡單有效率地管理多個條件?在使用 C、Java 或 JavaScript 等語言時,你可能已經使用過熟悉的switch-case 語句,根據變數的值在多個選項中進行選擇。然而,在 Python 中,這個經典機制直到最近才出現。雖然開發者多年來一直在尋找替代方案,但現在 Python 提供了一個現代且強大的解決方案。

本文將帶你全面了解如何使用 Python 中與 `switch` 等效的語句,探索舊版本中更強大的替代方案,闡明為何早期版本中沒有包含 `switch` 功能,並學習如何編寫更簡潔、更易讀的程式碼,無論你使用哪個 Python 版本。準備好學習在 Python 生態系統中實現多個條件語句的所有技巧、範例和關鍵區別吧!

Python 中存在 switch 嗎?它的歷史和缺失的原因

switch-case 語法在許多程式語言中都有應用,但在 Python 3.10 版本中才正式引入。主要原因在於理念:Python 的創建者始終將簡潔性和可讀性放在首位。他們認為引入新的 switch 語句語法可能會使程式碼變得複雜,因此if-elif-else足以彌補這一不足。此外,對於理想的 switch 語法,一直沒有共識。事實上,由於缺乏共識,以及許多人認為現有的 switch 語句已經足夠清晰有效,一些官方提案(例如 PEP 275 和 PEP 3103)最終被否決。

多年來,社群一直使用條件鍊和字典來彌補缺少 `switch` 語句的不足。毋庸置疑,這引發了不少爭論,但這些方法遠非不可克服的缺陷,反而展現出了彈性和高度的適應性。然而,隨著專案複雜性的增加,對更優雅解決方案的需求也日益凸顯。

什麼是 switch case?它有什麼用途?

switch -case語句是一種控制結構,在許多程式語言中都有應用,它根據變數或表達式的值來執行不同的程式碼區塊。換句話說,它允許你以簡潔明了的方式從多個選項中選擇一個,避免了無休止的條件語句鏈。

典型的使用範例是:根據數字顯示星期幾的名稱、分配等級、根據使用者輸入選擇操作等。在 C 或 Java 等語言中,它的語法很簡單:

switch(valor) {
    case 1:
        // acción
        break;
    case 2:
        // otra acción
        break;
    default:
        // acción por defecto
}

在 Python 中,這種經典結構直到最近才出現,因此開發人員必須發揮創意才能實現相同的結果。

Python 中 switch 的到來:match-case 語句(自 Python 3.10 起)

隨著 Python 3.10 版本的發布,它引入了一個期待已久的功能:match-case 語句。雖然它的語法類似於傳統的 switch-case 語句,但實際上它功能強大得多,因為它引入了模式匹配,不僅可以比較簡單的值,還可以比較複雜的結構,例如元組、類別、列表、字典等等。

Python 的 match-case 寫法如下:

def ejemplo_switch(x):
    match x:
        case 1:
            return "uno"
        case 2:
            return "dos"
        case _:
            return "desconocido"

底線(_)用作通配符,相當於其他語言中的預設值,當沒有先前的模式匹配時執行。

它為何如此強大?因為您可以接收複雜的模式、擷取變數、開啟元組或對象,甚至可以使用守衛語句在 case 語句後面加上額外的條件:

match dato:
    case (a, b) if a > b:
        print("El primer elemento es mayor que el segundo")
    case (a, b):
        print(f"Valores: {a}, {b}")

此外,在 Python 3.10 及更高版本中,這種結構提高了程式碼的可讀性、可維護性和可擴展性,尤其是在處理許多情況時。

  免費 Pascal 語言參考 - 完整指南

切換到舊版的 Python 的替代方案

在match-case出現之前,開發者們設計了同樣有效的替代方案。其中最常見的兩種是使用 if-elif-else 字串和字典映射。讓我們詳細了解一下:

1. 使用 if-elif-else

最直接、最簡單的解決方案是使用 if、elif 和 else 語句串聯條件。這樣可以涵蓋變數的所有可能值,並執行對應的程式碼區塊。例如,要根據數字顯示星期幾:

dia = 4
if dia == 1:
    print('lunes')
elif dia == 2:
    print('martes')
elif dia == 3:
    print('miércoles')
elif dia == 4:
    print('jueves')
elif dia == 5:
    print('viernes')
elif dia == 6:
    print('sábado')
elif dia == 7:
    print('domingo')
else:
    print('error')

這種方法的優點:

  • 簡單且易於閱讀的程式碼。
  • 您不需要任何其他特殊結構;它是純 Python。
  • 可以使用任何類型的比較,而不僅僅是相等。

if-elif-else 階梯式結構的缺點:

  • 重複代碼的傾向。 您必須在每次比較中重複變量,如果有很多案例,這會產生大量不必要的文字。
  • 當條件較多時效率較低。 如果案件已結案,則所有先前的案件都會在到達之前進行評估。
  • 難以動態新增或刪除案例。

2. 使用字典模擬 switch-case

模擬 switch 語句的一個非常符合 Python 風格的方法是使用字典。思路很簡單:將每個可能的值(鍵)與對應的函數或操作(值)關聯起來。然後,查詢字典以取得函數並執行它。

def lunes():
    print('lunes')
def martes():
    print('martes')
def error():
    print('error')

switch_semana = {
    1: lunes,
    2: martes,
    # ... otros días ...
}
dia = 8
switch_semana.get(dia, error)()

此方法的優點:

  • 緊湊且易於擴展的程式碼。
  • 非常快速地存取正確的功能。 該字典使用散列法,因此搜尋幾乎是即時的。
  • 允許您將相同的功能指派給多個鍵(例如,分組案例)。
  • 此開關可以在運作時修改。

缺點:

  • 它需要預先定義所有相關功能,這對於簡單的操作來說可能很麻煩。
  • 它僅允許進行比較(不適用於間隔、範圍等)。
  • 它不適用於每個選擇中具有更複雜的條件邏輯的情況。

if-elif-else 和 switch(或 match-case)之間的區別

if-elif-else 語句鏈的內部運作方式與 switch 語句不同。在 if-elif-else 語句中,條件會從上到下逐一評估,直到第一個條件為真。因此,如果目標值位於語句開頭,則處理速度很快;如果位於語句末尾,則耗時較長。

相較之下,傳統的 switch 語句(以及 Python 中的字典)通常使用查找表,因此無論 case 的數量或位置如何,存取速度都更加統一。而使用match-case 語句和字典,存取時間則更加穩定。

何時選擇每個替代方案?

沒有單一的通用解決方案;最好的工具取決於具體的問題。

  • 對於每個分支中條件數量較少或邏輯複雜的情況,if-elif-else 是最直接的選擇。 它允許任何比較並且非常靈活。
  • 當您有許多案例並且每個案例僅執行特定的操作時,請依賴字典。 程式碼更清晰、可擴展且更易於維護。
  • 如果您使用 Python 3.10 或更高版本, 匹配案例 這是清晰度和功率的最佳選擇。 它允許您將開關的優雅與複雜結構上的模式匹配的強大功能結合起來。

始終考慮程式碼的可讀性、效能和可維護性。

Python 中使用 switch 及其替代方案的實際範例

讓我們來看幾個應用這些替代方案的例子,從最小到最大複雜度:

範例 1:根據分數計算成績

# Usando if-elif-else
puntuacion = 85
if puntuacion >= 90:
    print('Sobresaliente')
elif puntuacion >= 80:
    print('Notable')
elif puntuacion >= 70:
    print('Bien')
else:
    print('Insuficiente')

這種情況非常適合使用條件,因為您處理的是間隔,而不是固定值。

範例 2:按數字顯示星期幾(使用字典)

# Definición de funciones para cada día
def lunes():
    print('lunes')
def martes():
    print('martes')
def miercoles():
    print('miércoles')
def jueves():
    print('jueves')
def viernes():
    print('viernes')
def sabado():
    print('sábado')
def domingo():
    print('domingo')
def error():
    print('error')
switch_semana = {
    1: lunes,
    2: martes,
    3: miercoles,
    4: jueves,
    5: viernes,
    6: sabado,
    7: domingo
}
dia = 8
switch_semana.get(dia, error)()

範例 3:使用匹配大小寫來選擇算術運算

operacion = 'suma'
a = 10
b = 5
match operacion:
    case 'suma':
        print(a + b)
    case 'resta':
        print(a - b)
    case 'multiplicacion':
        print(a * b)
    case 'division':
        print(a / b)
    case _:
        print('Operación no válida')

如你所見,語法簡單明了。下劃線表示預設情況。

  開源智能體AI框架完整指南

進階範例:使用 match-case 進行模式匹配

區分大小寫分析的最大優點在於它能夠處理複雜的模式。例如,它可以分析元組、列表、字典、物件等等。

punto = (3, 5)
match punto:
    case (0, 0):
        print('Origen')
    case (0, y):
        print(f'Eje Y en {y}')
    case (x, 0):
        print(f'Eje X en {x}')
    case (x, y):
        print(f'Coordenadas X={x}, Y={y}')

您甚至可以使用if(守衛)子句為每個 case 新增附加條件。

if-elif-else、字典和 match-case 之間的效能差異

大多數情況下,對於典型的腳本來說,效能差異可以忽略不計。然而,當存在大量替代方案時,字典和區分大小寫的參數可能更有效率,因為它們減少了比較次數。無論如何,最重要的因素通常是程式碼的可讀性和可維護性,而不是在實際專案中很少能產生顯著影響的微優化。

使用使程式碼更清晰並避免錯誤的技術。

創造性的解決方案:模擬切換的類別和上下文管理器

一些開發者創建了專門的類,可以模擬 switch 的經典行為,包括高級選項,例如添加break來控制後續 case 的執行、對 case 進行分組、自定義比較,或者激活嚴格模式以確保只執行一個分支。

例如,可以實作自訂上下文管理器來使用與其他語言非常相似的語法:

class switch:
    def __init__(self, variable, comparator=None, strict=False):
        self.variable = variable
        self.matched = False
        self.matching = False
        if comparator:
            self.comparator = comparator
        else:
            self.comparator = lambda x, y: x == y
        self.strict = strict
    def __enter__(self):
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        pass
    def case(self, expr, break_=False):
        if self.strict:
            if self.matched:
                return False
            if self.matching or self.comparator(self.variable, expr):
                if not break_:
                    self.matching = True
                else:
                    self.matched = True
                    self.matching = False
                return True
            else:
                return False
        else:
            if self.matching or self.comparator(self.variable, expr):
                if not break_:
                    self.matching = True
                else:
                    self.matched = True
                    self.matching = False
                return True
            else:
                return False
    def default(self):
        return not self.matched and not self.matching

使用此類允許使用以下語法:

dia = 4
with switch(dia) as s:
    if s.case(1, True): print('lunes')
    if s.case(2, True): print('martes')
    if s.case(3, True): print('miércoles')
    if s.case(4, True): print('jueves')
    if s.case(5, True): print('viernes')
    if s.case(6, True): print('sábado')
    if s.case(7, True): print('domingo')
    if s.default(): print('error')

這種方案有哪些優點?對於來自其他語言的開發者來說,它的語法非常熟悉,並且允許進行高級自定義,例如使用任何比較函數、對用例進行分組、執行多個分支或僅執行一個分支等等。缺點是速度往往較慢,並且需要導入或定義特殊的類別。

使用 lambda 函數簡化字典操作

通常情況下,你不需要為每個操作定義單獨的函數;你可以使用匿名(lambda)函數。當要執行的操作很簡單時,這種方法尤其實用:

switch_operaciones = {
    'sumar': lambda a, b: a + b,
    'restar': lambda a, b: a - b,
    'multiplicar': lambda a, b: a * b
}
operacion = 'sumar'
resultado = switch_operaciones.get(operacion, lambda a, b: None)(5, 3)
print(resultado)

這使得程式碼緊湊且易於擴展,同時又不失清晰度。

進階用例:Match-Case 中的模式匹配

Python 3.10 的`match-case`語句遠遠不止是單純複製經典的 `switch-case` 語句。它的真正強大之處在於能夠匹配結構模式。例如,它可以輕鬆區分不同的資料結構、自訂類別、分解物件以及捕獲子元素。

列表和元組的範例:

datos = 
match datos:
    case :
        print('Lista con 1, 2, 3')
    case :
        print('Lista que empieza con 1')
    case _:
        print('Otra lista')

物件範例(假設為 Point 類別):

class Punto:
    def __init__(self, x, y):
        self.x = x
        self.y = y
p = Punto(2, 3)
match p:
    case Punto(x=0, y=0):
        print('Origen')
    case Punto(x, y):
        print(f'Coordenadas: {x} {y}')

這種機制允許您編寫適應複雜結構的高度表達的程式碼,而不會失去可讀性。

  關於高階語言及其重要性

遷移程式碼時需要考慮的方面:相容性和最佳實踐

並非所有專案都能立即使用 match-case。如果您使用的是較舊版本的 Python(例如 3.8 或 3.9),則必須選擇字典。如果可以升級到 3.10 或更高版本,請充分利用模式匹配的強大功能和清晰性,尤其是在需要多選邏輯的專案中。

記住:

  • 選擇提供最佳可讀性、靈活性和易於維護的選項。
  • 在非常簡單的問題中(少數情況),if-elif-else 通常就足夠了,而且更直接。
  • 對於大型選擇表,請使用字典和函數。
  • 對於複雜的結構或為了充分利用現代 Python,請選擇 match-case。

一個小技巧:您可以將現有函數轉換為接受動作字典,從而使方法之間的轉換更加容易。

更簡潔的 Python 程式碼的最佳化和設計技巧

不要為了模仿經典的 switch 語句而設計無止盡的條件語句鏈。仔細考慮每個具體情況,評估哪種控制結構對程序上下文最有價值。記住,Python 重視程式碼的清晰性,所以如果能用更簡潔的方式達到相同的效果,就避免過度複雜化程式碼。

重要提示: 使用字典時,請使用該功能 get() 如果鍵不存在,則避免出現錯誤,從而能夠優雅地定義預設情況。

與其他語言的比較和最終想法

在某些語言中,例如 C、C++ 或 Java,開關僅用於比較簡單值(整數、字串),對複雜結構的作用不大。 Python 則更進一步:首先,它提供了豐富的替代方案(if-elif-else、字典),現在它無需額外努力即可實現高級邏輯。關鍵在於充分利用每個版本的優勢,如果問題需要不同的解決方案,則不要強迫自己模仿其他語法。

如果您剛開始學習 Python 或之前學習過其他語言,在手冊中找不到 switch 關鍵字也不用擔心。請仔細考慮所有可用的選項,然後選擇最適合您情況和需求的選項。

在 Python 中管理多個替代方案從未如此輕鬆和強大。現在,您了解了 switch 語句消失(以及後來出現)的原因,如何在任何版本中有效地模擬它,以及如何充分利用新的 match-case 語句。無論您需要在六個選項中進行選擇、操作複雜的結構、遵循最佳實踐,還是擔心效能問題,您都可以擁有強大、優雅且靈活的替代方案。無論您的程式碼是用於快速腳本還是複雜的應用程序,Python 都能為​​您提供清晰、快速、輕鬆編寫程式碼的工具。

命令式程式設計-0
相關文章:
命令式程式設計:它是什麼、優點、差異和實際例子