python?中pass和match使用方法
前言
??pass?
? 語句不執(zhí)行任何操作。語法上需要一個語句,但程序不實(shí)際執(zhí)行任何動作時,可以使用該語句。
例如:
>>> while True: ... pass # Busy-wait for keyboard interrupt (Ctrl+C) ...
下面這段代碼創(chuàng)建了一個最小的類:
>>> class MyEmptyClass: ... pass ...
??pass?
?? 還可以用作函數(shù)或條件子句的占位符,讓開發(fā)者聚焦更抽象的層次。此時,程序直接忽略 ??pass?
?:>>>
>>> def initlog(*args): ... pass # Remember to implement this! ...
match?? 語句
A ??match?
? statement takes an expression and compares its value to successive patterns given as one or more case blocks. This is superficially similar to a switch statement in C, Java or JavaScript (and many other languages), but it can also extract components (sequence elements or object attributes) from the value into variables.
最簡單的形式是將一個目標(biāo)值與一個或多個字面值進(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"
注意最后一個代碼塊:“變量名” ??_?
? 被作為 通配符 并必定會匹配成功。 如果沒有 case 語句匹配成功,則不會執(zhí)行任何分支。使用 ??|?
? (“ or ”)在一個模式中可以組合多個字面值:
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ì)研究此代碼! 第一個模式有兩個字面值,可以看作是上面所示字面值模式的擴(kuò)展。但接下來的兩個模式結(jié)合了一個字面值和一個變量,而變量 綁定 了一個來自目標(biāo)的值(??point?
??)。第四個模式捕獲了兩個值,這使得它在概念上類似于解包賦值 ??(x, y) = point?
?。
如果使用類實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu),可在類名后加一個類似于構(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"),則以下模式均為等價的,并且都把 ??y?
?? 屬性綁定到 ??var?
? 變量:
Point(1, var) Point(1, y=var) Point(x=1, y=var) Point(y=var, x=1)
讀取模式的推薦方式是將它們看做是你會在賦值操作左側(cè)放置的內(nèi)容的擴(kuò)展形式,以便理解各個變量將會被設(shè)置的值。 只有單獨(dú)的名稱(例如上面的 ??var?
??)會被 match 語句所賦值。 帶點(diǎn)號的名稱 (例如 ??foo.bar?
??)、屬性名稱(例如上面的 ??x=?
?? 和 ??y=?
??)或類名稱(通過其后的 "(...)" 來識別,例如上面的 ??Point?
?)都絕不會被賦值。
模式可以任意地嵌套。例如,如果有一個由點(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ù)匹配下一個 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, *_)?
?可以匹配包含至少兩個條目的序列,而不必綁定其余的條目。 - Mapping patterns:?
?{"bandwidth": b, "latency": l}?
??captures the??"bandwidth"?
??and??"latency"?
??values from a dictionary. Unlike sequence patterns, extra keys are ignored. An unpacking like??**rest?
??is also supported. (But??**_?
?would be redundant, so it is not allowed.) - 使用?
?as?
?關(guān)鍵字可以捕獲子模式:
case (Point(x1, y1), Point(x2, y2) as p2): ...
- 將把輸入的第二個元素捕獲為?
?p2?
?(只要輸入是包含兩個點(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 中pass和match使用方法的文章就介紹到這了,更多相關(guān)python pass和match內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 運(yùn)用Python3實(shí)現(xiàn)Two-Pass算法檢測區(qū)域連通性
- Python pass函數(shù)實(shí)例用法
- Python中pass的作用與使用教程
- python getpass模塊用法及實(shí)例詳解
- python中break、continue 、exit() 、pass終止循環(huán)的區(qū)別詳解
- Python?OpenCV中的drawMatches()關(guān)鍵匹配繪制方法
- 深入理解最新Python中的Match Case
- python正則表達(dá)式函數(shù)match()和search()的區(qū)別
- Python3.9.1中使用match方法詳解
相關(guān)文章
Linux 發(fā)郵件磁盤空間監(jiān)控(python)
這篇文章主要介紹了Linux發(fā)郵件磁盤空間監(jiān)控功能,python實(shí)現(xiàn),需要的朋友可以參考下2016-04-04python3獲取當(dāng)前目錄的實(shí)現(xiàn)方法
這篇文章主要介紹了python3獲取當(dāng)前目錄的實(shí)現(xiàn)方法,文中給大家提到了python3獲取當(dāng)前目錄和上級目錄的方法,需要的朋友可以參考下2019-07-07python pygame實(shí)現(xiàn)擋板彈球游戲
這篇文章主要為大家詳細(xì)介紹了python pygame實(shí)現(xiàn)擋板彈球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11對Python中Iterator和Iterable的區(qū)別詳解
今天小編就為大家分享一篇對Python中Iterator和Iterable的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10Python Celery多隊(duì)列配置代碼實(shí)例
這篇文章主要介紹了Python Celery多隊(duì)列配置代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11Python可執(zhí)行文件反編譯教程(exe轉(zhuǎn)py)
python的便利性,使得如今許多軟件開發(fā)者、黑客都開始使用python打包成exe的方式進(jìn)行程序的發(fā)布,那么Python如何反編譯可執(zhí)行文件,本文就來介紹一下,感興趣的可以了解一下2021-12-12python和pywin32實(shí)現(xiàn)窗口查找、遍歷和點(diǎn)擊的示例代碼
這篇文章主要介紹了python和pywin32實(shí)現(xiàn)窗口查找、遍歷和點(diǎn)擊的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04