Python3.10新特性之match語句


本文主要介紹Python 3.10帶來的新特性——match語句。

在Python 3.10發布之前,Python是沒有類似於其他語言中switch語句的,要實現類似的功能最簡單的方法就是通過if ... elif ... else ...語句,但是這樣畢竟不夠優雅,不夠“Pythonic”。

更推薦的做法是通過字典(dict)實現。

通過字典間接實現 switch

想要通過字典來實現條件分支語句,首先我們需要定義一個字典,來表示不同case返回值/函數之間的映射關系,然后再利用字典的特性,即可以實現類似於switch的功能。

下面定義一個簡單的函數,傳入不同的case就會打印不同的內容,也可以將打印內容的語句替換成你想要執行的函數:

def switch(case):
    mapping = {
        1: "print('case 1')",
        2: "print('case 2')"
    }
    return eval(mapping[case])

運行結果:

可以看到,輸出結果正是我們想要的“case 1”的結果。

在Python 3.10出現之前,我們更多的是通過上面這種字典映射的方式,來實現類似於switch語句的功能。但是伴隨着Python 3.10的發布,Python也終於迎來了自己的'switch'語句,也就是接下來我們重點介紹的match語句。

Python 3.10 新特性—— match 語句

參考資料:Python 3.10增加了比switch更強大的match表達式

在運行以下代碼之前,請先確保自己的Python版本大於等於3.10。

和其他語言一樣,當變量a滿足哪個case的條件時,就會執行該條件下的對應代碼:

a = 1

match a:
    case 1:
        print('case 1')
    case 2:
        print('case 2')

運行結果:

默認分支

當變量a不滿足任意一個case條件時,如果我們沒有對“其他“情況進行處理,那么是不會執行任何操作的。

下面的代碼是不會有任何輸出的,因為a不滿足任意一個條件:

a = 3

match a:
    case 1:
        print('case 1')
    case 2:
        print('case 2')

如果想要對”其他“情況進行處理,那么寫法如下:

a = 3

match a:
    case 1:
        print('case 1')
    case 2:
        print('case 2')
    case default:
        print('case default', default)

運行結果:

可以看到,當變量a不符合任意一個條件時,就會運行到我們的default分支,同時會把變量值賦值給default變量。

注意:這里的default僅僅只是一個變量名而已,並非規定寫法,也可以使用其他變量名,例如x等。其作用就是在變量不符合任意一個分支條件時,將變量值賦值給該變量。

在case中使用元組

Python的match語句不僅支持數值類型的分支,也支持其他數據類型,例如元組(tuple)。

a = (2, 4)

match a:
    case (1, 2):
        print('case 1')
    case (2, x):
        print('case 2', x)

運行結果:

可以看到,變量a在匹配到第二個分支條件時,還把元組的第二個元素值4賦值給了變量x

在case中使用判斷語句

不僅如此,match語句還支持在分支條件中插入判斷語句:

a = (2, 2)
flag = False

match a:
    case (1, 2):
        print('case 1')
    case (2, x) if flag:
        print('case 2', x)
    case default:
        print('case default', default)

運行結果:

由於第二個分支條件中if flagFalse,不符合條件,所以代碼進入到最后一個分支條件中。

小結

以上就是今天介紹的如何使用字典實現switch語句,以及最最重要的Python 3.10的新特性——match語句。
當然,現階段並不建議在你的Python項目中使用該新特性,因為目前主流的Python版本還不支持該特性,為了避免不必要的麻煩,還是只能先使用字典映射的方式實現了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM