python 3.10支持match语句,3,10以下不支持。
(资料图)
match语句接受一个表达式,并将其值与作为一个或多个case块给出的连续模式进行比较。这表面上类似于C、Java或JavaScript(以及许多其他语言)中的switch语句,但更类似于Rust或Haskell等语言中的模式匹配。只有第一个匹配的模式才会被执行,它还可以将值中的组件(序列元素或对象属性)提取到变量中。
最简单的形式是将一个目标值与一个或多个字面值进行比较:
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 语句匹配成功,则不会执行任何分支。
使用 | (“ 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")
请仔细研究此代码! 第一个模式有两个字面值,可以看作是上面所示字面值模式的扩展。但接下来的两个模式结合了一个字面值和一个变量,而变量 绑定 了一个来自目标的值(point)。第四个模式捕获了两个值,这使得它在概念上类似于解包赋值 (x, y) = point。
如果使用类实现数据结构,可在类名后加一个类似于构造器的参数列表,这样做可以把属性放到变量里:
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 等支持属性排序的内置类中使用位置参数。还可在类中设置 __match_args__ 特殊属性为模式的属性定义指定位置。如果它被设为 ("x", "y"),则以下模式均为等价的,并且都把 y 属性绑定到 var 变量:
Point(1, var) Point(1, y=var) Point(x=1, y=var) Point(y=var, x=1)
读取模式的推荐方式是将它们看做是你会在赋值操作左侧放置的内容的扩展形式,以便理解各个变量将会被设置的值。 只有单独的名称(例如上面的 var)会被 match 语句所赋值。 带点号的名称 (例如 foo.bar)、属性名称(例如上面的 x= 和 y=)或类名称(通过其后的 "(...)" 来识别,例如上面的 Point)都绝不会被赋值。
模式可以任意地嵌套。例如,如果有一个由点组成的短列表,则可使用如下方式进行匹配:
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")
为模式添加成为守护项的 if 子句。如果守护项的值为假,则 match 继续匹配下一个 case 语句块。注意,值的捕获发生在守护项被求值之前:
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 语句的其他特性:
与解包赋值类似,元组和列表模式具有完全相同的含义,并且实际上能匹配任意序列。 但它们不能匹配迭代器或字符串。序列模式支持扩展解包操作:[x, y, *rest] 和 (x, y, *rest) 的作用类似于解包赋值。 在 * 之后的名称也可以为 _,因此,(x, y, *_) 可以匹配包含至少两个条目的序列,而不必绑定其余的条目。映射模式:{"bandwidth": b, "latency": l} 从字典中捕获 "bandwidth" 和 "latency" 的值。与序列模式不同,额外的键会被忽略。**rest 等解包操作也支持。但 **_ 是冗余的,不允许使用。使用 as 关键字可以捕获子模式:
case (Point(x1, y1), Point(x2, y2) as p2): ...
将把输入的第二个元素捕获为 p2 (只要输入是包含两个点的序列)
大多数字面值是按相等性比较的,但是单例对象 True, False 和 None 则是按标识号比较的。
模式可以使用命名常量。 这些命名常量必须为带点号的名称以防止它们被解读为捕获变量:
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 :(")
到此这篇关于Python match语句的具体使用的文章就介绍到这了,更多相关Python match内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
标签:
match语句接受一个表达式,并将其值与作为一个或多个case块给出的连续模式进行比较,本文主要介绍了Pyth...
IT之家4月21日消息,华为官方宣布,99元起可加购华为P60系列保值焕新服务,享50%折抵优惠,支持换购同系...
湖南日报•新湖南客户端4月20日讯(记者黄煌通讯员罗正坤)423全民阅读日即将到来,日前,《叶嘉莹读诵...
1、她就是人,她的手脚是被特拉法尔加·罗改造成鸟类的双翼和利爪,在此之前拥有正常人的手脚。2、自然...
*ST日海(002313)04月21日在投资者关系平台上答复了投资者关心的问题。
第三场决战,沙巴兹会成为广东男篮的“秘密武器”?,马尚,沙巴兹,胡金秋,孙铭徽,广东男篮,广厦男篮
按照“公开、平等、竞争、择优”的原则,成都世纪人力资源有限公司受郫都区红光街道委托,面向社会公开招...
今日NBA季后赛,快船在主场以124-129不敌太阳。赛后,威少接受了记者采访。他说自己要为上半场出现的失...
4月21日,招商安泰偏股混合最新单位净值为0 4396元,累计净值为3 9073元,较前一交易日下跌2 85%。历...
4月21日,博时恒旭持有期混合A最新单位净值为0 9973元,累计净值为0 9973元,较前一交易日下跌0 6%。...
截至上午收盘,上证综指报收3329 65点,下跌1 11%;深证成指收于11543 27点,下跌1 48%。创业板指下跌
1、内容简介编辑海王国有一个美丽而善良的美人鱼。2、美人鱼爱上了陆地上英俊的王子,为了追求爱情幸福...
本网讯为深入推进全县创建国家食品安全示范城市工作,提高业态点位打造质量,营造浓厚的创建宣传氛围,4...
江南电机2022年亏损408 43万同比由盈转亏收入规模下降较大2023 4 2120:24:10挖贝网雨婷挖贝网4月21日,江南电机(83998
4月21日下午,2023全球豫商大会在郑州开幕。会上,十位心系家乡、反哺家乡的豫商杰出代表获得“情系河南...
土鸡蛋和洋鸡蛋营养价值一样吗,土鸡蛋和洋鸡蛋很多人还不知道,现在让我们一起来看看吧!1 蛋壳:土鸡...
1、杏鲍菇是要蒸10-15分钟能熟。2、杏鲍菇的蒸的时间长短,跟杏鲍菇切成的形状和薄厚有关,越厚越难熟,...
汉语拼音教程,汉语拼音教程简单介绍很多人还不知道,现在让我们一起来看看吧!解答:1、编一首顺口溜,...
1、貌视不可以了,因为你已经做过你原来种族的相应任务。2、我不确定,你可以去试试也许这个任务是地精...
【京泉华:一季度归母净利润同比增441 04%】公司一季度实现营业收入7 81亿元,同比增长72 16%,归母...
X 关闭
X 关闭