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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

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

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

最簡(jiǎn)單的形式是將一個(gè)目標(biāo)值與一個(gè)或多個(gè)字面值進(jìn)行比較:

defhttp_error(status):

matchstatus:

case400:

return"Badrequest"

case404:

return"Notfound"

case418:

return"I'mateapot"

case_:

return"Something'swrongwiththeinternet"

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

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

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")

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

如果使用類實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu),可在類名后加一個(gè)類似于構(gòu)造器的參數(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ù)。還可在類中設(shè)置__match_args__特殊屬性為模式的屬性定義指定位置。如果它被設(shè)為(x,y),則以下模式均為等價(jià)的,并且都把y屬性綁定到var變量:

Point(1,var)

Point(1,y=var)

Point(x=1,y=var)

Point(y=var,x=1)

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

模式可以任意地嵌套。例如,如果有一個(gè)由點(diǎn)組成的短列表,則可使用如下方式進(jìn)行匹配:

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")

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

matchpoint:

casePoint(x,y)ifx==y:

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

casePoint(x,y):

print(f"Notonthediagonal")

match語(yǔ)句的其他特性:

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

使用as關(guān)鍵字可以捕獲子模式:

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

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

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

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

fromenumimportEnum

classColor(Enum):

RED='red'

GREEN='green'

BLUE='blue'

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

match

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論