整個九月份,我都在忙一個js的專案,因為好多年不寫js,動手之前特地找了一些js的資料惡補半天,結果發現js越來越像Python了,且不說js從基于原型的面向物件轉向了基于類的面向物件,單是型別化陣列(Typed Arrays)的引入,就讓用慣了NumPy的我喜出望外,另外,js的陣列推導式和裝飾器,也幾乎是完全照抄了Python的作業,
進入十月,Python社區指導委員會正式推出了Python3.10,距離上一個版本發布,正好過去了一年,記得Python3.9發布之后沒幾天,我寫過一篇名為《危險的轉變:Python正在從簡明轉向臃腫,從實用轉向媚俗》的博文,著實吐槽了一番,正所謂愛之也深恨之也切,這次新版本發布,我自然不會放過嘗鮮的機會,趕緊安裝嘗試了一下,卻發現,一向特立獨行的Python居然開始抄作業了,這次抄的是Rust,
眾所周知,Rust有兩樣鎮山之寶,一是安全的記憶體模型,二是模式匹配,在記憶體管理上,Python使用了傳統的垃圾回收的記憶體模型,和Rust沒有多少可比性,隨著Python3.10的發布,模式匹配被引入到Python中,而且幾乎是完全照搬了Rust的概念, Rust支持模式匹配中的變數系結、結構體/元組解構、守衛條件判斷、數值范圍匹配等特性,Python照單全收,連下劃線 _ 匹配任意情形也原封不動地繼承了過來,
讓我們一起來揭開Pyhton3.10最重要的升級——模式匹配的蓋頭,
類似C語言的switch case, Python的模式匹配最簡單的應用就是對字面值進行匹配:
>>> a = 3
>>> match(a):
case 1:
print("a == 1")
case 2:
print("a == 2")
case _: # default
print("other")
other
case陳述句中,支持或操作:
>>> import datetime
>>> n = datetime.datetime.now()
>>> match(n.weekday()):
case 0|1|2|3|4: print("作業日")
case 5|6: print("周末")
作業日
除了字面值外,case陳述句,支持對上面提到的模式進行解構,如對元組:
>>> a = (0, 1)
>>> match(a):
case (0, y): # 匹配所有第0個元素是0的元組
print(f"a[0]==0, a[1]=={y}")
case (x, 0): # 匹配所有第1個元素是0的元組
print(f"a[1]==0, a[0]=={x}")
a[0]==0, a[1]==1
對串列:
>>> cmd = "ls test"
>>> match(cmd.split()):
case ["ls", path]: print(f"顯示{path}中的檔案和目錄")
case ["rm", path]: print(f"洗掉{path}中的檔案和目錄")
case ["cp", src, dest]: print(f"將{src}復制到{dest}")
顯示test中的檔案和目錄
對字典:
>>> a = {"name": "xxx", "age": 40, "job": "程式員"}
>>> match(a):
case {"name": name, "age": age, "job": "程式員"}:
print(f"他是一名程式員,名字叫{name}, {age}歲了")
case {"name": name, "age": age, "job": "教師"}:
print(f"他是一名人民教師,名字叫{name}, {age}歲了")
他是一名程式員,名字叫xxx, 40歲了
對于類物件,match case照樣可以使用如:
>>> class Point():
def __init__(self,x,y):
self.x = x
self.y = y
>>> a = Point(1, 2)
>>> match(a):
case Point(x=1, y=y): print(f"這是一個X坐標為1的點,它的Y坐標為{y}")
case Point(x=x, y=2): print(f"這是一個Y坐標為2的點,它的X坐標為{x}")
這是一個X坐標為1的點,它的Y坐標為2
也可以用于多個類:
>>> class Programmer:
def __init__(self, lang):
self.lang = lang
>>> class Teacher:
def __init__(self, subject):
self.subject = subject
>>> a = Programmer("Python")
>>> match(a):
case Programmer(lang="Python"): print("咱們都是Pyhon程式員!")
case Programmer(): print("原來你也是一名程式員!")
case Teacher(): print("向人民教師致敬!")
咱們都是Pyhon程式員!
case 陳述句后,還支持添加一個if陳述句,進一步對匹配的條件進行限制,這個if陳述句,被稱之為“守衛”,如:
>>> class Point():
def __init__(self,x,y):
self.x = x
self.y = y
>>> a = Point(2,2)
>>> match(a):
case Point(x=x, y=y) if x==y: print("這個點在斜率為1的直線上")
case Point(x=x, y=y) if x==-y: print("這個點在斜率為-1的直線上")
這個點在斜率為1的直線上
美中不足的是,我沒有找到case陳述句中直接使用范圍的方法,但這個可以用守衛來解決:
>>> a = 5
>>> match(a):
case x if 1 <= x < 10: print("數字在1和10之間")
case x if 10 <= x < 20: print("數字在10和20之間")
數字在1和10之間
怎么樣?蓋頭之下的模式匹配是不是Rust家的那位小姑娘呢?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/336184.html
標籤:其他
