」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Python 中的結構模式匹配

Python 中的結構模式匹配

發佈於2024-11-09
瀏覽:163

Structural pattern matching in Python

結構模式匹配是Python中的一個強大功能,它允許您根據複雜資料的結構做出決策並從中提取所需的值。它提供了一種簡潔、聲明式的方式來表達條件邏輯,可以大大提高程式碼的可讀性和可維護性。在本文中,我們將探討一些在 Python 中使用結構模式匹配的真實案例研究範例。

1。解析 API 回應
結構模式匹配的常見用例是解析 API 回應。假設您正在使用一個天氣 API,該 API 以以下格式傳回資料:

{
  "current_weather": {
    "location": "New York",
    "temperature": 25,
    "conditions": "Sunny"
  }
}

要從此回應中提取溫度,您可以使用結構模式匹配,如下所示:

response = {
  "current_weather": {
    "location": "New York",
    "temperature": 25,
    "conditions": "Sunny"
  }
}

match response:
    case {"current_weather": {"temperature": temp}}:
        print(f"The current temperature in {response['current_weather']['location']} is {temp} degrees Celsius.")
    case _:
        print("Invalid response.")

此模式會匹配任何帶有“current_weather”鍵的字典,並且在該鍵中,它會匹配“溫度”值並將其提取為變數 temp。這使您可以輕鬆存取所需的數據,而無需編寫多個 if 語句來檢查鍵是否存在。

2.資料處理
在處理大型資料集時,結構模式匹配也很有用。想像一下,您有一個資料集,其中包含有關不同產品的信息,包括它們的名稱、類別和價格。您希望過濾資料集以僅包含低於特定價格閾值的產品。您可以使用模式匹配來提取所需的資料並對其進行過濾,如下所示:

products = [
  {"name": "Smartphone", "category": "Electronics", "price": 500},
  {"name": "T-shirt", "category": "Clothing", "price": 20},
  {"name": "Headphones", "category": "Electronics", "price": 100},
  {"name": "Jeans", "category": "Clothing", "price": 50},
]

match products:
    case [{"category": "Electronics", "price": price} for price in range(200)] as electronics:
        print([product["name"] for product in electronics])
    case [{"category": "Clothing", "price": price} for price in range(40)] as clothing:
        print([product["name"] for product in clothing])
    case _:
        print("No products found.")

在此範例中,模式根據類別和價格約束進行匹配並提取值。這允許使用更簡潔和可讀的方法來過濾資料集。

3.驗證使用者輸入
結構模式匹配對於驗證用戶輸入也很有用。想像一下,您正在為一個網站建立註冊表單,並且您希望確保使用者的電子郵件格式正確並且其密碼符合某些要求。您可以使用模式匹配來執行這些驗證,如下所示:

import re

email = "[email protected]"
password = "12345"

match email:
    case _ if not re.match(r"^\w @[a-zA-Z_] ?\.[a-zA-Z]{2,3}$", email):
        print("Invalid email format.")
    case _ if len(password) 



此模式使用正規表示式配對並驗證電子郵件格式,並使用長度檢查來匹配和驗證密碼長度。這種方法可以輕鬆擴展,以根據需要包含額外的驗證。

4。動態調度函數
結構模式匹配的另一個有趣的用例是根據輸入參數動態調度函數。想像一下,您正在使用計算器程序,使用者可以在其中輸入一個運算和兩個數字,該程式將為它們執行計算。您可以使用模式匹配根據指定的操作執行正確的函數,如下所示:

from operator import add, sub, mul, truediv as div

def calculate(operator, num1, num2):
    match operator:
        case " ":
            return add(num1, num2)
        case "-":
            return sub(num1, num2)
        case "*":
            return mul(num1, num2)
        case "/":
            return div(num1, num2)
        case _:
            print("Invalid operation.")

result = calculate("*", 5, 3)
print(f"The result is: {result}")
# Output: The result is: 15

此模式符合指定的運算子並執行運算子模組中的對應函數。這提供了一種緊湊且可擴展的方法來處理不同的操作,而無需編寫多個 if 語句。

結論
結構模式匹配是 Python 中的強大功能,可實現簡潔、宣告性和選擇性程式碼。它可用於多種場景,從解析 API 回應到驗證使用者輸入和動態調度函數。透過利用結構模式,您可以提高程式碼的可讀性和可維護性,並使複雜的邏輯更易於管理。

版本聲明 本文轉載於:https://dev.to/myexamcloud/structural-pattern-matching-in-python-3em1?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Redux 工具包:React Thunk 和 React Saga。
    Redux 工具包:React Thunk 和 React Saga。
    React Thunk 和 React Saga 是用于处理 React 应用程序中副作用的中间件库,特别是用于管理 API 调用等异步操作。两者通常与 Redux 一起使用,但用途和方法略有不同。 React Thunk 1. 概述: React ...
    程式設計 發佈於2024-11-09
  • 如何使用並發在 Go 中高效率地讀寫 CSV 檔案?
    如何使用並發在 Go 中高效率地讀寫 CSV 檔案?
    Go 中高效的 CSV 讀寫Go 中高效的 CSV 讀寫package main import ( "encoding/csv" "fmt" "log" "os" "strconv"...
    程式設計 發佈於2024-11-09
  • 以下是一些標題選項,請記住問題格式:

簡單直接:

* 如何用JavaScript動態調整輸入欄位寬度?
* 建立響應式輸入欄位:JavaScript So
    以下是一些標題選項,請記住問題格式: 簡單直接: * 如何用JavaScript動態調整輸入欄位寬度? * 建立響應式輸入欄位:JavaScript So
    動態調整輸入字段的寬度以適應其輸入動態調整輸入字段的寬度以匹配其內容長度可以增強用戶體驗防止佈局混亂。雖然設定固定寬度可能會導致多餘的空間或截斷文本,但動態方法可確保輸入欄位具有視覺吸引力和功能性。 不幸的是,使用 CSS 的 min-width 屬性來設定最小寬度不適用於輸入欄位。然而,現代瀏覽器...
    程式設計 發佈於2024-11-09
  • 如何使用 JavaScript 從 iFrame 重新導向父視窗?
    如何使用 JavaScript 從 iFrame 重新導向父視窗?
    從iFrame 重定向父視窗如果父視窗中嵌入了iFrame,則可能需要重定向父視窗視窗的位置更改為新的URL。為了實現這一點,JavaScript 提供了一個簡單的解決方案。 使用JavaScript 重新導向父視窗在iFrame 的JavaScript 程式碼中,您可以使用以下方法: 重定向最頂層...
    程式設計 發佈於2024-11-09
  • 如何使用 Curl 模擬 Web 瀏覽器的 GET 請求?
    如何使用 Curl 模擬 Web 瀏覽器的 GET 請求?
    使用Curl 模擬Web 瀏覽器的GET 請求嘗試使用curl 檢索網頁時,您可能會遇到似乎源於以下原因的錯誤無法辨識或未實現的請求標頭。這是因為curl本身並不會模擬網頁瀏覽器的GET請求標頭。 要正確模擬網頁瀏覽器,請依照下列步驟操作:設定使用者代理程式:使用CURLOPT_USERAGENT為...
    程式設計 發佈於2024-11-09
  • 透過「從參數中提取資訊」專案釋放您的 Python 能力
    透過「從參數中提取資訊」專案釋放您的 Python 能力
    您準備好將您的 Python 技能提升到新的水平了嗎? LabEx 提供的「從參數中提取資訊」專案就是您的最佳選擇。這個引人入勝的項目將引導您完成從給定文本中提取數字、計算平均值並將結果格式化為小數點後兩位的過程。潛入並釋放你作為 Python 程式設計師的真正潛力! 踏上令人興奮...
    程式設計 發佈於2024-11-09
  • HTML 表單中的預設提交按鈕行為是什麼?
    HTML 表單中的預設提交按鈕行為是什麼?
    確定HTML 表單中的預設提交按鈕在未按一下特定提交按鈕的情況下提交HTML 表單時,例如按輸入或在JavaScript 中使用HTMLFormElement.submit(),瀏覽器需要確定多個提交按鈕(如果有)中的哪一個應被視為按下的按鈕。此確定對於觸發 onclick 事件處理程序和傳送到 W...
    程式設計 發佈於2024-11-09
  • 如何在Python中實現非同步Shell指令執行:探索最佳實踐
    如何在Python中實現非同步Shell指令執行:探索最佳實踐
    Python 中的非同步Shell 指令執行:探索替代方法從Python 腳本非同步執行外部指令是一項有價值的技術,允許持續執行腳本當外部命令執行其任務時。本文探討了實現這種異步行為的適當方法,重點關注os.system() 和subprocess.Popen.os.system() 和& 符號 的...
    程式設計 發佈於2024-11-09
  • 狀態測試案例中的 ReactDOM.unstable_batchedUpdates。
    狀態測試案例中的 ReactDOM.unstable_batchedUpdates。
    在本文中,我們將研究 ReactDOM.unstable_batchedUpdates 在測試案例中的使用,特別是在 Zustand(React 的流行狀態管理庫)中。我們還將分解測試並解釋批次更新如何透過最小化不必要的重新渲染來增強 React 的效能。 理解測試案例 這是我們將...
    程式設計 發佈於2024-11-09
  • 如何使用 jQuery 和 CSS 建立響應式水平頁面滑動系統?
    如何使用 jQuery 和 CSS 建立響應式水平頁面滑動系統?
    響應式水平頁面滑動問題設計響應式水平導航系統面臨幾個挑戰:維護頁視窗內的可見性防止之間的間隙或重疊頁允許頁超出100%高度,並具有捲軸可見性確保與Internet Explorer 9 或更高版本的兼容性解決方案該解決方案採用jQuery 並包含以下主要功能:響應式調整大小:腳本根據頁數計算包裝器的...
    程式設計 發佈於2024-11-09
  • 為什麼編譯器中的「static_assert」與非型別模板參數的行為不同?
    為什麼編譯器中的「static_assert」與非型別模板參數的行為不同?
    編譯器中非型別模板參數的 static_assert 行為不一致 在 C 中,static_assert 在編譯時可驗證條件。然而,最近的觀察發現,當 static_assert 與不同編譯器中的非類型模板參數結合使用時,其行為存在差異。 具體來說,以下程式碼片段:template <int ...
    程式設計 發佈於2024-11-09
  • 何時以及如何在 JavaScript 的 parseInt() 函數中使用 Radix?
    何時以及如何在 JavaScript 的 parseInt() 函數中使用 Radix?
    了解 parseInt 中對基數的需求JavaScript 中的 parseInt() 函數可讓您將表示數字的字串轉換為整數。但是,您可能不會總是希望將整數解析為以 10 為基數的數字。這就是基數參數發揮作用的地方。 什麼是基數? 基數是指在數字系統中單一數字可以表示的值的數量。例如,我們常用的十進...
    程式設計 發佈於2024-11-09
  • 嘗試重載佇列構造函數
    嘗試重載佇列構造函數
    此專案旨在透過新增兩個新的建構子來改進 Queue 類別。 第一個建構子將從另一個現有佇列建立一個新佇列。 第二個建構子將允許您建立具有初始值的佇列。 這些建構子顯著提高了 Queue 類別的可用性。 1 建立一個名為 QDemo2.java 的文件,並將更新後的 Queue 類別從 Tr...
    程式設計 發佈於2024-11-09
  • 實施訂單處理系統:零件監控與警報
    實施訂單處理系統:零件監控與警報
    1. Introduction and Goals Welcome to the fourth installment of our series on implementing a sophisticated order processing system! In our pre...
    程式設計 發佈於2024-11-09
  • 以客戶端為中心的錯誤處理
    以客戶端為中心的錯誤處理
    了解和处理错误 为了有效地处理错误,必须了解可能发生的错误类型。让我们首先对您可能遇到的错误进行分类。 Web 客户端环境中的错误类型 网络错误 连接问题:与服务器建立连接时出现问题。 超时:请求花费太长时间才能收到响应。 DNS 错误:域名解析问题...
    程式設計 發佈於2024-11-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3