Python語言match-case簡介

吳修福 Hugh Wu

  • 精誠資訊/恆逸教育訓練中心-資深講師
  • 技術分類:程式設計

 

 

Python語言隨著使用的人越來越多,其語言結構發展也越朝向複雜化,這樣的趨勢可以讓Python語言也能建立具有複雜行為的程式。

從3.10版開始,依據PEP634新增了match-case的語言結構。為什麼會新增這個結構呢?在3.9版(含)之前,Python語言並沒有一個類似其他程式語言常見的switch-case結構,因此,如果程式中需要像是針對一個運算元但是多條件的判斷,例如衣服的顏色或尺寸,其他程式語言利用switch-case就可以簡單做到紅色或藍色分別該進行的動作,但在Python就只有一長串的if-elif-elif…可以用。但有了match-case之後也可以很優雅的完成這樣的行為。

現在來看一下簡單的一個例子:

    match subject:
        case pattern:
            do_something


如果您熟悉其他語言的switch-case會發現上述的結構很接近,原則上作用的方式也差不多,也就是當subject的內容等於某個case後面的pattern時,那就會執行該case區塊中的程式碼。當有多個case區塊時,只有符合的區塊會執行,後續的區塊並不會。

match-case與其他語言switch-case相比,最大不同的地方在於可以在case區塊後方附加guard。這是什麼意思呢?請看下面的例子:

    match subject:
        case pattern:
            do_something_a
        case pattern:
            do_something_b


上面的例子中可以看到兩個case區塊的pattern是相同的,這在Python是允許的。或許您會困惑那subject與pattern相等時會執行do_something_a還是do_something_b(後續以a,b稱)呢?答案是a,如果case後的pattern有一樣的,則以這個結構中出現的順序做為判斷的依據。不過除了pattern,我們想要再加上另一個條件來判斷要執行a還是b,那麼我們就可以利用guard了:

    match subject:
        case pattern if condition:
            do_something_a
        case pattern:
            do_something_b


上面的第一個case區塊後可以再附加一個if敘述,這就是match-case的guard。也就是說,如果subject與pattern相等,且condition為True時,那就會執行a區塊;只有與pattern相等,但condition為False時,則會執行b區塊。

這樣是不是讓match-case有了更彈性的使用方式呢?不過使用guard時也需要注意順序的問題,像是以下的例子:

    match subject:
        case pattern:
            do_something_a
        case pattern if condition:
            do_something_b


pattern相同,但是guard寫在第二個case區塊的話,這樣不管該區塊的guard condition是否為True,只要pattern相符,都只有a區塊會執行,這點請在寫時要特別注意。

match-case是3.10版中最重要的結構改變,除了類似其他程式語言switch-case的使用方式外,還可以配合集合甚至物件來進行更複雜的操作喔,礙於篇幅的關係,如果想要更進一步了解match-case可以怎麼改變以往Python程式的條件判斷,歡迎大家來參加「Python程式設計」課程喔!


您可在下列課程中了解更多技巧喔!

相關學習資源