自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python 3.10 正式發(fā)布了!我發(fā)現了一個可怕的功能...

開發(fā) 后端
2021年10月4日 Python 終于正式發(fā)布了 3.10 版本,看了下這個版本的一些特性,最受關注的應該就是 結構模式匹配 了吧?也就是大家所熟悉的 match-case。

 2021年10月4日 Python 終于正式發(fā)布了 3.10 版本,看了下這個版本的一些特性,最受關注的應該就是 結構模式匹配 了吧?也就是大家所熟悉的switch-case,寫錯了不好意思,是 match-case。

下邊是最簡單的一個 match-case 的例子,看起來是不是非常的直觀簡潔? 

  1. def http_error(status):  
  2.     match status:  
  3.         case 400:  
  4.             print("Bad request")  
  5.         case 404:  
  6.             print("Not found")  
  7.         case 418:  
  8.             print("I'm a teapot")  
  9.         case _:  
  10.             print("Something's wrong with the internet") 

對這個功能滿懷期待的我,趕緊就下載升級了 3.10 的 Python 趕緊試用,可沒想到在我深入的體驗過后,我從最開始的期待,變成了敬畏。

敬畏,是因為這樣一個看似簡單的新功能,卻有著不少的學習成本,并且對 結構模式匹配 半知半解的人來說,會增大代碼出錯的概率,并不是大數人都能輕松駕馭的。

我為什么會這么說呢?我會在文章最后來簡述我的觀點。

鑒于大多數人,都沒有實際用過這種 結構模式匹配,我會從 升級 3.10 開始教大家如何嘗鮮這個新功能,然后我會詳細的介紹 match-case 的使用方法。

 1. 升級 3.10 新版本

我本機的電腦上目前的 Python 版本是 3.9.1 的 

  1. $ /usr/local/bin/python3 --version  
  2. Python 3.9.1 

由于這邊我使用的是 mac,因此我從官網上下載的是 Python 3.10 的 pkg 文件,如果是 win 的用戶,可以下載相應的 msi 或者 exe 文件。

下載鏈接我貼在下邊,可以直接訪問下載 

  1. mac: https://www.python.org/ftp/python/3.10.0/python-3.10.0-macos11.pkg  
  2. win: https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe 

我下載好安裝文件后,雙擊安裝,之后就雙擊下載的 pkg 文件,進入安裝流程

一路點擊繼續(xù),該同意的同意一下,出現如下提示表示安裝成功。

再次在終端上確認下是否升級成功

 2. or 模式的使用

在上面我已經貼出一個 match-case 的最簡單示例,這邊就直接跳過簡單示例,來說說那些比較特殊的用法。

在 Python 3.10 中其實有新增一個 聯合類型操作符 | ,但這個只能用于類型,具體的用法,我會在下一篇文章中做詳細的介紹,本篇文章還是集中于 match-case 的使用。

在學習match-case 的時候,你會發(fā)現,也有一個類似于聯合類型操作符的用法,但請你要注意區(qū)別,它并不是聯合類型操作,而是在 match-case 下獨有的 or模式操作符 | ,它可以將多個具體相同邏輯的 case 語句簡寫成同一個 

  1. match status:  
  2.     case 401 | 403 | 404:  
  3.         print("Not allowed")  
  4.     case _:  
  5.         print("Something's wrong with the internet") 

 3. 通配符匹配任意對象

match-case 的出現有利于提高代碼的可讀性,讓你的代碼更加優(yōu)雅,但同時要使用好它,也是有一些門檻的,特別是通配符的使用。

下邊我舉一些例子來進行講解

在如下代碼中,使用了通配符 _ 和 可變參數中的  * 符號 

  1. import sys  
  2. match sys.argv[1:]:  
  3.     case ["quit"]:  
  4.         print("exit")  
  5.     case ["create", user]:     # 創(chuàng)建單個用戶  
  6.         print("create", user)  
  7.     case ["create", *users]:  # 批量創(chuàng)建多個用戶  
  8.         for user in users:  
  9.             print("create", user)  
  10.     case _:  
  11.         print("Sorry, I couldn't understand the argv") 

最后一個 case 中的 _ 并不作為變量名,而表示一種特殊的模式,在前面的 case 中都未命中的情況下,該 case 會是最后的保障,能確保命中,它相當于 Go 語言中的 default 分支。 

  1. import "fmt"  
  2. func main() {  
  3.     education :"本科"  
  4.     switch education {  
  5.     case "博士":  
  6.         fmt.Println("我是博士")  
  7.     case "研究生":  
  8.         fmt.Println("我是研究生")  
  9.     case "本科":  
  10.         fmt.Println("我是本科生")  
  11.     case "大專":  
  12.         fmt.Println("我是大專生")  
  13.     default:  
  14.         fmt.Println("學歷未達標..")  
  15.     } 
  16.  

 4. 使用可變參數 *args

第二個 case 和 第三個 case 非常的像,區(qū)別在于第三個 case中 users 前加了個 *,他跟原 Python 函數中的可變參數是一個用法,會匹配列表的多個值。

在該中表示可以從命令行參數中批量創(chuàng)建用戶。

在 match-case 中相應的 case 若有運行到,對應的變量是會被創(chuàng)建的。比如:

 5. 使用可變參數 **kv

在如下代碼中,**rest 會匹配到所有的 args 中的 key 和 value

 6. 長度的匹配方式

若你希望使用 case 僅對對象的長度做一些匹配,可以使用下面這樣的方式

  •  [*_] 匹配任意長度的 list;
  •  (, , *_) 匹配長度至少為 2 的 tuple。

 7. 類對象的匹配

對于類對象的匹配,下邊這個例子足夠簡單,不再講解。

 8. 匹配要注意順序

在上邊基本介紹完了 match-case 的使用方法,如需更詳細的內容,不如去通讀下 PEP 636(https://www.python.org/dev/peps/pep-0636/) 的內容。

在文章最開始的時候,我說過開發(fā)者應該對這些新特性 心存敬畏,match-case 這樣一個看似簡單的新功能,卻有著不少的學習成本,如果對 結構模式匹配 半知半解的人來說,可能會增大代碼出錯的概率,并不是大數人都能輕松駕馭的。

之所以會這么說,是因為 match-case 在面對不同的對象,它的匹配的規(guī)則也有所不同。

  •  當 match 的對象是一個 list 或者 tuple 的時候,需要長度和元素值都能匹配,才能命中,這就是為什么下面這個例子走的是第三個 case 而不是第二個 case。

  •  當 match 的對象是一個 dict 的時候,規(guī)則卻有所不同,只要 case 表達式中的 key 在所 match 的對象中有存在,即可命中。

  •  而當 match 的對象是類對象時,匹配的規(guī)則是,跟 dict 有點類似,只要對象類型和對象的屬性有滿足 case 的條件,就能命中。

因此在寫 match-case 的時候,最大的難點可能就是如何把握這個順序,才能確保你寫的代碼不會翻車。

我個人總結一些規(guī)律,僅供大家參考:

  •  list 或者 tuple:應該從不格式到嚴格
  •  dict 或者 object:應該從嚴格到不嚴格

在經過半天時間的嘗鮮后,我有了一些自己的理解,分享給大家,不知道我的理解有沒有問題,但我依然建議大家在 充分了解 match-case 的匹配規(guī)則 后,再去使用它。 

 

責任編輯:龐桂玉 來源: Python編程
相關推薦

2023-06-24 23:11:07

2022-11-30 09:18:51

JavaMyBatisMQ

2021-04-22 07:47:47

JavaJDKMYSQL

2024-05-20 08:25:55

2024-06-03 11:43:55

2021-06-02 08:00:57

WebAsyncTas項目異步

2020-05-18 08:42:23

CSS背景圖像前端開發(fā)

2023-05-17 00:22:15

2021-04-28 14:31:35

Dubbo接口日志

2023-02-26 01:02:22

2021-12-29 19:20:41

數據GitHub服務器

2020-04-01 08:40:44

Vue.jsweb開發(fā)

2019-01-14 11:10:43

機器學習人工智能計算機

2020-06-09 08:05:11

Android 代碼操作系統

2023-06-20 08:01:09

RoseDB存儲數據

2020-06-16 08:39:35

JavaScript圖像處理庫

2021-07-10 07:40:27

Excel數據分析大數據

2018-03-07 09:35:08

Python淘寶數據

2020-04-14 15:30:00

微信群管理朋友圈

2020-08-13 18:54:53

Python代碼解釋器
點贊
收藏

51CTO技術棧公眾號