Python模式匹配match case的實(shí)現(xiàn)
核心概念
當(dāng)程序需要針對(duì)一個(gè)變量的多種可能值進(jìn)行判斷時(shí),傳統(tǒng)的 if ... elif ... elif ... else 結(jié)構(gòu)會(huì)變得冗長且可讀性較差。Python 3.10 引入了 match 語句(也稱為模式匹配),它提供了一種更簡潔、更直觀的方式來處理多分支條件判斷。
1. 基本match語句
- 功能:將一個(gè)目標(biāo)(如變量)與一系列模式(
case)進(jìn)行比較,并執(zhí)行第一個(gè)匹配成功的分支。 - 與傳統(tǒng)if對(duì)比:
- if 寫法 (冗長):
score = 'B' if score == 'A': print('score is A.') elif score == 'B': print('score is B.') elif score == 'C': print('score is C.') else: print('invalid score.') - match 寫法 (清晰):
score = 'B' match score: case 'A': print('score is A.') case 'B': print('score is B.') case 'C': print('score is C.') case _: # `_` 是通配符,匹配任何值 print('invalid score.')
- if 寫法 (冗長):
- 關(guān)鍵點(diǎn): -
case _:必須放在最后,用于捕獲所有未被前面 case 匹配的情況,類似于else。- 語法結(jié)構(gòu)更加規(guī)整,意圖更明確。
2. 復(fù)雜匹配模式
match 的強(qiáng)大之處在于其靈活的匹配模式,遠(yuǎn)不止簡單的相等判斷。
- 帶守衛(wèi)條件的匹配:使用
if在case內(nèi)進(jìn)行額外條件檢查。 - 多值匹配:使用
|(或)來匹配多個(gè)值。 - 值綁定:在匹配的同時(shí),將匹配到的值捕獲到變量中。
示例:
age = 15
match age:
case x if x < 10: # 匹配所有小于10的值,并將其綁定到變量x
print(f'< 10 years old: {x}')
case 10: # 精確匹配單個(gè)值
print('10 years old.')
case 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18: # 匹配多個(gè)值
print('11~18 years old.')
case 19:
print('19 years old.')
case _:
print('not sure.')
3. 高級(jí)應(yīng)用:匹配列表(解包匹配)
match 語句可以匹配復(fù)雜的數(shù)據(jù)結(jié)構(gòu),如列表,并能進(jìn)行解包操作,這使其功能非常強(qiáng)大。
示例:解析命令行參數(shù)
args = ['gcc', 'hello.c', 'world.c'] # 模擬用戶輸入的命令
match args:
# 模式1: 列表只包含一個(gè)元素'gcc'
case ['gcc']:
print('gcc: missing source file(s).')
# 模式2: 列表第一個(gè)元素是'gcc',第二個(gè)是任意值(綁定到file1),后面是0個(gè)或多個(gè)值(綁定到files)
case ['gcc', file1, *files]:
print(f'gcc compile: {file1}, {", ".join(files)}')
# 模式3: 列表只包含一個(gè)元素'clean'
case ['clean']:
print('clean')
# 默認(rèn)情況
case _:
print('invalid command.')
*files:這是一個(gè)通配符,它可以捕獲列表中的零個(gè)或多個(gè)剩余元素。這使得匹配可變長度的列表變得非常簡單。- 工作原理:
match會(huì)按順序嘗試匹配每個(gè)case的模式。例如,對(duì)于['gcc', 'hello.c', 'world.c'],它會(huì)匹配第二個(gè)模式,并賦值file1 = 'hello.c'和files = ['world.c']。
總結(jié)要點(diǎn)
- 為什么使用
match:替代冗長的if-elif-else鏈,極大地提高代碼的可讀性和簡潔性,尤其是在處理多個(gè)枚舉值或復(fù)雜數(shù)據(jù)結(jié)構(gòu)時(shí)。 - 基本語法:使用
match TARGET:和一系列case PATTERN:進(jìn)行匹配。 - 強(qiáng)大功能:
- 精確匹配:
case 'A': - 或匹配:
case 11 | 12 | 13: - 守衛(wèi)條件:
case x if x < 10: - 通配符:
case _:(匹配任何值) - 解包匹配:
case ['cmd', arg1, *args]:(匹配并提取列表內(nèi)容)
- 精確匹配:
- 適用場景:處理狀態(tài)碼、命令解析、處理JSON或嵌套數(shù)據(jù)等任何需要多分支判斷的場景。
match 語句是Python現(xiàn)代化的重要特性,掌握它可以讓你的代碼更加優(yōu)雅和Pythonic。
將之前的練習(xí)題 重新寫一寫
hight = 1.50
weight = 50.5
bmi = weight / hight ** 2
print("bmi=", bmi)
match bmi:
case _ if bmi < 18.5:
print("過輕")
case _ if 18.5 <= bmi < 25:
print("正常")
case _ if 25 <= bmi < 28:
print("過重")
case _ if 28 <= bmi < 32:
print('肥胖')
case _:
print("嚴(yán)重肥胖")
到此這篇關(guān)于Python模式匹配match case的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python模式匹配match case內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python KNN算法實(shí)現(xiàn)鳶尾花數(shù)據(jù)集分類
這篇文章主要介紹了python KNN算法實(shí)現(xiàn)鳶尾花數(shù)據(jù)集分類,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
基于Python開發(fā)一個(gè)Instant Messaging(IM)聊天工具
在現(xiàn)代社會(huì)中,即時(shí)通訊工具已經(jīng)成為人們?nèi)粘贤ǖ闹匾ぞ?本文將詳細(xì)介紹如何開發(fā)一個(gè)簡單的IM聊天工具,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-12-12
解決PyCharm IDE環(huán)境下,執(zhí)行unittest不生成測試報(bào)告的問題
這篇文章主要介紹了解決PyCharm IDE環(huán)境下,執(zhí)行unittest不生成測試報(bào)告的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Python重復(fù)文件批量整理工具的設(shè)計(jì)與實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何通關(guān)Python編寫一個(gè)重復(fù)文件批量整理工具,可以在文件夾內(nèi)對(duì)文件進(jìn)行去重和分類存儲(chǔ),有需要的可以了解下2025-02-02
Python實(shí)現(xiàn)mysql數(shù)據(jù)庫中的SQL文件生成和導(dǎo)入
這篇文章主要介紹了Python實(shí)現(xiàn)mysql數(shù)據(jù)庫中的SQL文件生成和導(dǎo)入,首先通過將mysql數(shù)據(jù)導(dǎo)出到SQL文件中展開詳細(xì)內(nèi)容需要的小伙伴可以參考一下2022-06-06
使用Python第三方庫xlrd讀取Excel中的數(shù)據(jù)的流程步驟
這篇文章主要給大家介紹了使用Python第三方庫xlrd讀取Excel中的數(shù)據(jù)的流程步驟,文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2023-12-12
pytorch如何利用ResNet18進(jìn)行手寫數(shù)字識(shí)別
這篇文章主要介紹了pytorch如何利用ResNet18進(jìn)行手寫數(shù)字識(shí)別問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02

