Pythonmatch語句的具體使用_第1頁
Pythonmatch語句的具體使用_第2頁
Pythonmatch語句的具體使用_第3頁
Pythonmatch語句的具體使用_第4頁
Pythonmatch語句的具體使用_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第Pythonmatch語句的具體使用python3.10支持match語句,3,10以下不支持。

match語句接受一個表達式,并將其值與作為一個或多個case塊給出的連續(xù)模式進行比較。這表面上類似于C、Java或JavaScript(以及許多其他語言)中的switch語句,但更類似于Rust或Haskell等語言中的模式匹配。只有第一個匹配的模式才會被執(zhí)行,它還可以將值中的組件(序列元素或?qū)ο髮傩裕┨崛〉阶兞恐小?/p>

最簡單的形式是將一個目標值與一個或多個字面值進行比較:

defhttp_error(status):

matchstatus:

case400:

return"Badrequest"

case404:

return"Notfound"

case418:

return"I'mateapot"

case_:

return"Something'swrongwiththeinternet"

注意最后一個代碼塊:變量名_被作為通配符并必定會匹配成功。如果沒有case語句匹配成功,則不會執(zhí)行任何分支。

使用|(or)在一個模式中可以組合多個字面值:

case401|403|404:

return"Notallowed"

模式的形式類似解包賦值,并可被用于綁定變量:

#pointisan(x,y)tuple

matchpoint:

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_:

raiseValueError("Notapoint")

請仔細研究此代碼!第一個模式有兩個字面值,可以看作是上面所示字面值模式的擴展。但接下來的兩個模式結合了一個字面值和一個變量,而變量綁定了一個來自目標的值(point)。第四個模式捕獲了兩個值,這使得它在概念上類似于解包賦值(x,y)=point。

如果使用類實現(xiàn)數(shù)據(jù)結構,可在類名后加一個類似于構造器的參數(shù)列表,這樣做可以把屬性放到變量里:

classPoint:

x:int

y:int

defwhere_is(point):

matchpoint:

casePoint(x=0,y=0):

print("Origin")

casePoint(x=0,y=y):

print(f"Y={y}")

casePoint(x=x,y=0):

print(f"X={x}")

casePoint():

print("Somewhereelse")

case_:

print("Notapoint")

可在dataclass等支持屬性排序的內(nèi)置類中使用位置參數(shù)。還可在類中設置__match_args__特殊屬性為模式的屬性定義指定位置。如果它被設為(x,y),則以下模式均為等價的,并且都把y屬性綁定到var變量:

Point(1,var)

Point(1,y=var)

Point(x=1,y=var)

Point(y=var,x=1)

讀取模式的推薦方式是將它們看做是你會在賦值操作左側放置的內(nèi)容的擴展形式,以便理解各個變量將會被設置的值。只有單獨的名稱(例如上面的var)會被match語句所賦值。帶點號的名稱(例如foo.bar)、屬性名稱(例如上面的x=和y=)或類名稱(通過其后的(...)來識別,例如上面的Point)都絕不會被賦值。

模式可以任意地嵌套。例如,如果有一個由點組成的短列表,則可使用如下方式進行匹配:

matchpoints:

case[]:

print("Nopoints")

case[Point(0,0)]:

print("Theorigin")

case[Point(x,y)]:

print(f"Singlepoint{x},{y}")

case[Point(0,y1),Point(0,y2)]:

print(f"TwoontheYaxisat{y1},{y2}")

case_:

print("Somethingelse")

為模式添加成為守護項的if子句。如果守護項的值為假,則match繼續(xù)匹配下一個case語句塊。注意,值的捕獲發(fā)生在守護項被求值之前:

matchpoint:

casePoint(x,y)ifx==y:

print(f"Y=Xat{x}")

casePoint(x,y):

print(f"Notonthediagonal")

match語句的其他特性:

與解包賦值類似,元組和列表模式具有完全相同的含義,并且實際上能匹配任意序列。但它們不能匹配迭代器或字符串。序列模式支持擴展解包操作:[x,y,*rest]和(x,y,*rest)的作用類似于解包賦值。在*之后的名稱也可以為_,因此,(x,y,*_)可以匹配包含至少兩個條目的序列,而不必綁定其余的條目。映射模式:{bandwidth:b,latency:l}從字典中捕獲bandwidth和latency的值。與序列模式不同,額外的鍵會被忽略。**rest等解包操作也支持。但**_是冗余的,不允許使用。

使用as關鍵字可以捕獲子模式:

case(Point(x1,y1),Point(x2,y2)asp2):...

將把輸入的第二個元素捕獲為p2(只要輸入是包含兩個點的序列)

大多數(shù)字面值是按相等性比較的,但是單例對象True,False和None則是按標識號比較的。

模式可以使用命名常量。這些命名常量必須為帶點號的名稱以防止它們被解讀為捕獲變量:

fromenumimportEnum

classColor(Enum):

RED='red'

GREEN='green'

BLUE='blue'

color=Color(input("Enteryourchoiceof'red','blue'or'green':"))

match

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論