python結構化模式匹配switch-case,Python 3.10中引入,Python的模式匹配(pattern matching)語法

增加了采用模式加上相應動作的?match 語句?和?case 語句?的形式的結構化模式匹配。 模式由序列、映射、基本數據類型以及類實例構成。 模式匹配使得程序能夠從復雜的數據類型中提取信息、根據數據結構實現分支,并基于不同的數據形式應用特定的動作。

語法與操作

模式匹配的通用語法如下:

match subject:case <pattern_1>:<action_1>case <pattern_2>:<action_2>case <pattern_3>:<action_3>case _:<action_wildcard>

match 語句接受一個表達式并將其值與以一個或多個 case 語句塊形式給出的一系列模式進行比較。 具體來說,模式匹配的操作如下:

  1. 使用具有特定類型和形狀的數據 (subject)

  2. 針對?subject?在?match?語句中求值

  3. 從上到下對 subject 與?case?語句中的每個模式進行比較直到確認匹配到一個模式。

  4. 執行與被確認匹配的模式相關聯的動作。

  5. 如果沒有確認到一個完全的匹配,則如果提供了使用通配符?_?的最后一個 case 語句,則它將被用作已匹配模式。 如果沒有確認到一個完全的匹配并且不存在使用通配符的 case 語句,則整個 match 代碼塊不執行任何操作。

聲明性方式

讀者可能是通過 C, Java 或 JavaScript (以及其他許多語言) 中的?switch?語句將一個目標 (數據對象) 與一個字面值 (模式) 進行匹配的簡單例子了解到模式匹配的概念的。?switch?語句常常被用來將一個對象/表達式與包含在 case 語句中的字面值進行比較。

更強大的模式匹配例子可以在 Scala 和 Elixir 等語言中找到。 這種結構化模式匹配方式是“聲明性”的并且會顯式地為所要匹配的數據指定條件(模式)。

雖然使用嵌套的“if”語句的“命令性”系列指令可以被用來完成類似結構化模式匹配的效果,但它沒有“聲明性”方式那樣清晰。 相反地,“聲明性”方式指定了一個匹配所要滿足的條件,并且通過其顯式的模式使之更為易讀。 雖然結構化模式匹配可以采取將一個變量與一個 case 語句中的字面值進行比較的最簡單形式來使用,但它對于 Python 的真正價值在于其針對目標類型和形狀的處理操作。

簡單模式:匹配一個字面值

讓我們把這個例子看作是模式匹配的最簡單形式:一個值,即主詞,被匹配到幾個字面值,即模式。在下面的例子中,status?是匹配語句的主詞。模式是每個 case 語句,字面值代表請求狀態代碼。匹配后,將執行與該 case 相關的動作:

注:case后面跟變量,與case _是一樣的效果
def http_error(status):match status:case 400:return "Bad request"case 404:return "Not found"case 418:return "I'm a teapot"case _:return "Something's wrong with the internet"

如果傳給上述函數的?status?為 418,則會返回 "I'm a teapot"。 如果傳給上述函數的?status?為 500,則帶有?_?的 case 語句將作為通配符匹配,并會返回 "Something's wrong with the internet"。 請注意最后一個代碼塊:變量名?_?將作為?通配符?并確保目標將總是被匹配。?_?的使用是可選的。

你可以使用?|?(“ or ”)在一個模式中組合幾個字面值:

case 401 | 403 | 404:return "Not allowed"

無通配符的行為

如果我們修改上面的例子,去掉最后一個 case 塊,這個例子就變成:

def http_error(status):match status:case 400:return "Bad request"case 404:return "Not found"case 418:return "I'm a teapot"

如果不在 case 語句中使用?_,可能會出現不存在匹配的情況。如果不存在匹配,則行為是一個 no-op。例如,如果傳入了值為 500 的?status?,就會發生 no-op。

帶有字面值和變量的模式

模式可以看起來像解包形式,而且模式可以用來綁定變量。在這個例子中,一個數據點可以被解包為它的 x 坐標和 y 坐標:

# point is an (x, y) tuple
match point:case (0, 0):print("Origin")case (0, y):print(f"Y={y}")case (x, 0):print(f"X={x}")case (x, y):print(f"X={x}, Y={y}")case _:raise ValueError("Not a point")

第一個模式有兩個字面值?(0,?0)?,可以看作是上面所示字面值模式的擴展。接下來的兩個模式結合了一個字面值和一個變量,而變量?綁定?了一個來自主詞的值(point)。 第四種模式捕獲了兩個值,這使得它在概念上類似于解包賦值?(x,?y)?=?point?。

as關鍵字使用別名

set=(3,7)
match set:case(1,3):print("1 or 3")case ((3,7) as x):print(f"{x}")case _:print("other")

?

匹配模型也可以使用數據類型來匹配

list01 = [1, 2, 3, 4]
list02 = (10, 2)
match list02:#模式匹配可以在case后面使用if條件語句,也可以使用as關鍵字來給變量賦值case tuple([a,b]) if a>3:print("list01 is a tuple")case list([x,y]):#數據類型+元素數量print("list01 is a list")case set():print("list01 is a set")case _:  # 這里的 _ 代表其他任何類型print("list01 is not a tuple or a list")

匹配模式可解包

# 定義一個列表
list01 = [1, 2, 3, 4, 5, 6]

# 使用模式匹配語法進行匹配
match list01:
? ? # 如果列表中至少有兩個元素,將前兩個元素分別賦值給變量x和y,剩余的元素賦值給變量z
? ? case [x, y, *z]:
? ? ? ? print(f"x={x}, y={y}, rest={z}")
? ? # 如果列表中的元素不滿足前面的模式,則執行這個默認情況
? ? case _:
? ? ? ? print("Invalid pattern")
?

  • case [x, y, *z]:這個模式匹配語句檢查列表是否至少有兩個元素,如果是,它會將前兩個元素分別賦值給變量xy,剩余的元素賦值給變量z
  • case _:這個是默認情況,匹配所有其它情況。

在這個例子中,由于列表list01有至少兩個元素,因此第一個模式被匹配。x被賦值為1,y被賦值為2,剩余的元素3、4、5和6被賦值給變量z。所以,最后輸出的結果是:x=1, y=2, rest=[3, 4, 5, 6]

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21733.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21733.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21733.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux下配置Pytorch

1.Anaconda 1.1虛擬環境創建 2.Nvidia驅動 3.CUDA驅動安裝 4.Pytorch安裝 具體的步驟如上&#xff1a;可參考另一位博主的博客非常詳細&#xff1a; Linux服務器配置PythonPyTorchCUDA深度學習環境_linux cuda環境配置-CSDN博客https://blog.csdn.net/NSJim/article/detai…

極海APM32F072用Keil5燒錄失敗Error: Flash Download failed -“Cortex-MO+“

在用Keil5燒錄時&#xff0c;出現錯誤彈窗&#xff0c;大概長這樣&#xff1a; 檢查了一圈設置&#xff0c;都搞不好。 先用J-Flash&#xff0c;顯示讀寫保護&#xff08;未截圖&#xff09;&#xff0c;會跳出界面讓選擇是否解除讀寫保護&#xff1a; 1.點擊允許讀操作YES&am…

DNF手游攻略:0氪攻略,轉職技巧與避坑指南!

在DNF手游的冒險旅程中&#xff0c;角色的轉職是一次重要的成長經歷。通過轉職&#xff0c;玩家可以獲得全新的技能和屬性&#xff0c;提升自己在地下城中的戰斗力。本文將為您介紹轉職后的關鍵技巧和日常任務&#xff0c;幫助您更好地適應新的職業身份&#xff0c;成為地下城中…

Python從0到100(二十九):requests模塊處理cookie

1 爬蟲中使用cookie 為了能夠通過爬蟲獲取到登錄后的頁面&#xff0c;或者是解決通過cookie的反扒&#xff0c;需要使用request來處理cookie相關的請求 1.1 爬蟲中使用cookie的利弊 帶上cookie的好處 能夠訪問登錄后的頁面能夠實現部分反反爬 帶上cookie的壞處 一套cookie往往…

數據庫與低代碼開發:技術革新與應用實踐

在數字化時代&#xff0c;企業對軟件開發的需求日益增長&#xff0c;同時對開發效率和成本控制的要求也越來越高。在這樣的背景下&#xff0c;低代碼開發平臺應運而生&#xff0c;它允許開發者通過圖形界面和配置化操作&#xff0c;快速構建應用程序&#xff0c;而無需編寫大量…

【設計模式】JAVA Design Patterns——Monitor(監視器模式)

&#x1f50d;目的 主要目的是為多個線程或進程提供一種結構化和受控的方式來安全地訪問和操作共享資源&#xff0c;例如變量、數據結構或代碼的關鍵部分&#xff0c;而不會導致沖突或競爭條件。 &#x1f50d;解釋 通俗描述 監視器模式用于強制對數據進行單線程訪問。 一次只允…

Windows線程同步的四種方式和區別

1. Windows線程同步的四種方式 2. 區別 Critical Section更多強調的是保護&#xff0c;Event對象、Mutex對象與Semaphore對象更多的強調的是同步&#xff1b;Critical Section對象是無法設置等待超時的&#xff0c;而其他三個對象則可以設置等待超時&#xff0c;從這一點來講…

ROS2在RVIZ2中加載機器人urdf模型

參考ROS2-rviz2顯示模型 我這邊用的solid works生成的urdf以及meshes&#xff0c;比參考的方法多了meshes 問題一&#xff1a;Error retrieving file [package://rm_dcr_description/meshes/leftarm_link7.STL]: Package [rm_dcr_description] does not exist 這個是urdf模型中…

VisualStudio中:如果某個項目不顯示SVN的show log等,而其他項目都正常

VisualStudio中&#xff1a;如果某個項目不顯示SVN的show log等&#xff0c;而其他項目都正常。說明大概率是當前項目的問題&#xff0c;而不是VisualStudio的問題&#xff01; 1.這個項目內有一個“隱藏”文件夾.svn 》先刪除&#xff01; 2.如果外層文件夾有紅色感嘆號&…

2024-5-14——完成所有任務需要的最少輪數

2024-5-14 題目來源我的題解方法一 哈希表數學 題目來源 力扣每日一題&#xff1b;題序&#xff1a;2244 我的題解 方法一 哈希表數學 根據數學規律可以發現&#xff0c;除了只有1個任務時不能完成任務&#xff0c;其他的都可以完成。并且需要的輪數為&#xff1a; ?x/3? …

16、matlab求導、求偏導、求定積分、不定積分、數值積分和數值二重積分

1、matlab求導,diff()函數 1)一階導數 語法:diff(f(x)):求一階導數 //diff(f(x),n):求n階導數(n為具體正整數) 以函數(cos(x)+sin(x)-x^2)的一階導數為例 一階導數代碼: yms x;%聲明符號變量x f(x)=cos(x)+sin(x)-x^2;%定義原式子 dy=diff(f(x))%求一階導數dy =cos(…

機器學習-12-開源的機器學習可視化拖拉拽工具orange3的應用

參考orange3,一個無敵的 Python 庫! 參考orange3的GitHub地址 參考orange3的官方應用示例 參考下載Orange模塊,總是出錯? 參考Orange3入門(Orange3Dev) 參考工具|Orange 3:機器學習入門神器 1 orange3 數據科學和機器學習是當今科技領域的重要組成部分,而數據分析和建…

Csv--01--ExportUtil 寫文件

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 ExportUtil案例&#xff1a; ExportUtil.writeCsvFile ExportUtil import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists;import org.apache…

記錄request中上傳圖片接口的測試過程

F12抓取的接口地址如下&#xff1a; 入參&#xff1a; 注意圈出來的部分參數 apifox調試接口 python相關代碼&#xff1a; 接口調用相關文件&#xff1a; select_photo.py 輸出結果&#xff1a; 相關接口的一些封裝&#xff1a;

Window 批量改文件后綴,例如,test.xls文件改為 test.csv;或者sas 文件改 sql 文件

echo off setlocal enabledelayedexpansion :: 設置需要遍歷的文件夾路徑 set "folderPathD:\test" ::遍歷文件夾內所有文件夾 for /d %%i in("folderPath%\*") do( echo Processing folder: %%i ::遍歷當前文件夾內所有.sas文件 for %%j in ("%%i\*…

【一百零三】【算法分析與設計】并查集,并查集的實現,P3367 【模板】并查集

并查集的實現 描述 給定一個沒有重復值的整形數組arr&#xff0c;初始時認為arr中每一個數各自都是一個單獨的集合。請設計一種叫UnionFind的結構&#xff0c;并提供以下兩個操作。 boolean isSameSet(int a, int b): 查詢a和b這兩個數是否屬于一個集合 void union(int a, int …

K210視覺識別模塊學習筆記2:固件的下載升級_官方數字識別例程導入方法

今日開始學習K210視覺識別模塊:固件的下載升級_官方數字識別例程導入方法 主要學習如何升級固件庫&#xff0c;在哪下載固件庫&#xff0c;以及如何在TF卡正確導入官方例程&#xff1a; 亞博智能的K210視覺識別模塊...... 固件庫版本: canmv_yahboom_v2.1.1.bin 本次最終目…

醫學數據屬于小樣本,或許源于資源不對等|羅小羅·說

小羅碎碎念 醫學數據屬于小樣本&#xff0c;或許源于資源不對等 今天這篇推文&#xff0c;源于一場對話。 我和他&#xff08;粉絲&#xff09;聊完以后&#xff0c;覺得心里總是壓了點什么東西&#xff0c;直到我寫完那篇關于醫學數據類別不平衡的文章&#xff0c;我才大致理…

SEO之關鍵詞擴展(一)

初創企業搭建網站的朋友看1號文章&#xff1b;想學習云計算&#xff0c;怎么入門看2號文章謝謝支持&#xff1a; 1、我給不會敲代碼又想搭建網站的人建議2、新手上云 確定了核心關鍵詞后&#xff0c;接下來就是進行關鍵詞擴展。對一個稍有規模的網站來說&#xff0c;研究幾十個…

Java設計模式 _行為型模式_狀態模式

一、狀態模式 1、狀態模式 狀態模式&#xff08;State Pattern&#xff09;是一種行為型模式。 它允許一個對象在其內部狀態改變時改變它的行為。狀態模式把所研究的對象的行為包裝在不同的狀態對象里&#xff0c;每一個狀態對象都屬于一個抽象狀態類的一個子類。狀態模式的意圖…