全球熱文:Python?match語句的具體使用
                發(fā)布時(shí)間:2023-04-22 06:08:05 文章來源:腳本之家
                match語句接受一個(gè)表達(dá)式,并將其值與作為一個(gè)或多個(gè)case塊給出的連續(xù)模式進(jìn)行比較,本文主要介紹了Pythonmatch語句的具體使用,對大家的學(xué)習(xí)

                python 3.10支持match語句,3,10以下不支持。

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

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


                【資料圖】

                def http_error(status):
                    match status:
                        case 400:
                            return "Bad request"
                        case 404:
                            return "Not found"
                        case 418:
                            return "I"m a teapot"
                        case _:
                            return "Something"s wrong with the internet"
                

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

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

                case 401 | 403 | 404:
                    return "Not allowed"
                

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

                # point is an (x, y) tuple
                match point:
                    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 _:
                        raise ValueError("Not a point")
                

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

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

                class Point:
                    x: int
                    y: int
                 
                def where_is(point):
                    match point:
                        case Point(x=0, y=0):
                            print("Origin")
                        case Point(x=0, y=y):
                            print(f"Y={y}")
                        case Point(x=x, y=0):
                            print(f"X={x}")
                        case Point():
                            print("Somewhere else")
                        case _:
                            print("Not a point")

                可在 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)
                

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

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

                match points:
                    case []:
                        print("No points")
                    case [Point(0, 0)]:
                        print("The origin")
                    case [Point(x, y)]:
                        print(f"Single point {x}, {y}")
                    case [Point(0, y1), Point(0, y2)]:
                        print(f"Two on the Y axis at {y1}, {y2}")
                    case _:
                        print("Something else")
                

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

                match point:
                    case Point(x, y) if x == y:
                        print(f"Y=X at {x}")
                    case Point(x, y):
                        print(f"Not on the diagonal")
                

                match 語句的其他特性:

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

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

                case (Point(x1, y1), Point(x2, y2) as p2): ...
                

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

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

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

                from enum import Enum
                class Color(Enum):
                    RED = "red"
                    GREEN = "green"
                    BLUE = "blue"
                 
                color = Color(input("Enter your choice of "red", "blue" or "green": "))
                 
                match color:
                    case Color.RED:
                        print("I see red!")
                    case Color.GREEN:
                        print("Grass is green")
                    case Color.BLUE:
                        print("I"m feeling the blues :(")

                到此這篇關(guān)于Python match語句的具體使用的文章就介紹到這了,更多相關(guān)Python match內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

                標(biāo)簽:

                資訊播報(bào)

                樂活HOT

                • 《熊出沒·伴我“熊芯”》票房破10億 打破內(nèi)地影史春節(jié)檔動(dòng)畫片紀(jì)錄
                  《熊出沒·伴我“熊芯”》票房破

                  據(jù)各方數(shù)據(jù),1月31日上午10時(shí)許,深圳出品的動(dòng)畫電影《熊出沒·伴我熊芯》票房突破10億元,在首日票房、檔期票房、連續(xù)破億天數(shù)等多方面打

                • 今年春節(jié)深圳游客出境游訂單量大幅增加 曼谷等地成為最受歡迎目的地
                  今年春節(jié)深圳游客出境游訂單量大

                  1月27日,攜程發(fā)布的《2023年春節(jié)旅游總結(jié)報(bào)告》顯示,今年春節(jié),深圳游客的出境游訂單量同比去年增長近5倍。相較國內(nèi)熱門景點(diǎn)的人山人海,

                • 2023年春節(jié)黃金周深圳共接待游客469.25萬人次 旅游收入31.58億元
                  2023年春節(jié)黃金周深圳共接待游客

                  1月27日,記者從深圳市文化廣電旅游體育局獲悉,2023年春節(jié)黃金周期間(1月21日至27日),深圳共接待游客469 25萬人次,旅游收入31 58億元,

                • 深圳機(jī)場連續(xù)多日客流量超過10萬人次 衛(wèi)星廳迎來首個(gè)大客流春運(yùn)
                  深圳機(jī)場連續(xù)多日客流量超過10萬

                  據(jù)深圳市春運(yùn)辦統(tǒng)計(jì),1月15日和16日連續(xù)兩天,深圳對外發(fā)送旅客人數(shù)都在48萬左右,春運(yùn)進(jìn)入客流高峰期。1月15日,深圳春運(yùn)對外旅客發(fā)送量達(dá)

                • 深圳交響樂團(tuán)將將舉辦兩場音樂會 以世界經(jīng)典管弦樂和歌劇詠嘆調(diào)為主
                  深圳交響樂團(tuán)將將舉辦兩場音樂會

                  新年音樂會是觀眾喜聞樂見的年度重要文化品牌活動(dòng),多年來已成為深圳市民跨歲迎新的例牌項(xiàng)目。12月30日、31日晚,深圳交響樂團(tuán)將在深圳音樂

                • 深圳大力推進(jìn)實(shí)施人才強(qiáng)市戰(zhàn)略 深圳市人才總量已達(dá)到663萬人
                  深圳大力推進(jìn)實(shí)施人才強(qiáng)市戰(zhàn)略

                  作為來深科研人員中的一員,中山大學(xué)附屬第八醫(yī)院的助理研究員郭雅婕對深圳在人才服務(wù)方面的舉措贊不絕口:我作為基礎(chǔ)研究人員,很希望自己

                • 2023年故宮年票正式開售 有消費(fèi)者目前仍對購買年票持觀望態(tài)度
                  2023年故宮年票正式開售 有消費(fèi)

                  12月1日晚8點(diǎn),2023年故宮年票正式開售。相比于去年,今年購票順暢了許多。據(jù)了解,2022年故宮年票發(fā)售時(shí),因短時(shí)間內(nèi)購買年票人數(shù)過多,曾

                • 御寒類商品消費(fèi)需求有所上升 羽絨服的整體銷售額同比增長達(dá)100%
                  御寒類商品消費(fèi)需求有所上升 羽

                  昨日,冷空氣到達(dá),廣州氣溫逐步下降。據(jù)商超方面預(yù)測,隨著氣溫的逐漸下降,市民對于御寒類商品消費(fèi)需求有所上升,不少廣州商超準(zhǔn)備了有關(guān)

                • 深圳全市共排查窨井蓋約350萬個(gè) 發(fā)現(xiàn)存在問題的窨井蓋約3.2萬個(gè)
                  深圳全市共排查窨井蓋約350萬個(gè)

                  小井蓋、大民生。今年以來,深圳開展全市窨井蓋專項(xiàng)治理工作成效顯著。截至11月20日,全市共排查窨井蓋約350萬個(gè),發(fā)現(xiàn)存在問題的窨井蓋約3

                • 汕汕鐵路汕頭站公布最新動(dòng)態(tài) 首期工程預(yù)計(jì)將于2024年11月完成
                  汕汕鐵路汕頭站公布最新動(dòng)態(tài) 首

                  備受關(guān)注的汕汕(汕頭至汕尾)鐵路汕頭站及站區(qū)工程近日傳出最新動(dòng)態(tài):項(xiàng)目已順利完成工程招標(biāo)工作,由中鐵建設(shè)集團(tuán)有限公司中標(biāo)承建。目前,

                娛樂LOVE

                精彩推送

                久久精品国产亚洲av天美18| 久久精品国产亚洲av水果派| 亚洲色图视频在线观看| 亚洲精品无码成人AAA片| 亚洲伦乱亚洲h视频| 亚洲国产欧美日韩精品一区二区三区 | 亚洲综合一区二区国产精品| 亚洲第一AV网站| 亚洲AV日韩AV永久无码下载| 亚洲精品乱码久久久久久蜜桃不卡| 红杏亚洲影院一区二区三区| 亚洲熟妇少妇任你躁在线观看无码| 五月婷婷亚洲综合| 国产亚洲精品精品精品| 亚洲av成人一区二区三区在线观看| 国产精品亚洲专区无码不卡| 亚洲国产日韩成人综合天堂| 亚洲欧洲国产成人综合在线观看| 亚洲国产天堂久久综合| 久久久久国产成人精品亚洲午夜| 中文字幕第一页亚洲| 亚洲午夜久久久影院伊人 | 亚洲美女aⅴ久久久91| 亚洲成人黄色在线| 国产精品亚洲精品观看不卡| 亚洲日韩AV一区二区三区四区| 亚洲欧美日韩综合久久久久| 日本亚洲中午字幕乱码| 亚洲精品国产V片在线观看| 国内精品久久久久久久亚洲| 亚洲国产精品乱码一区二区 | 亚洲av无码专区在线观看亚| va亚洲va日韩不卡在线观看| 亚洲熟女乱综合一区二区| 亚洲精品国产成人片| 久久亚洲精品人成综合网| 亚洲最大黄色网站| 亚洲色偷偷偷综合网| 国产大陆亚洲精品国产| 亚洲午夜福利717| 久久久国产精品亚洲一区|