当前位置: 首页 > 后端技术 > Python

Python重大变化:是match-case,不是switch-case

时间:2023-03-26 17:35:05 Python

Python的主要变化:match-case,不是switch-case最简单的if-else形式如下,将匹配主题表达式与一个或多个字面量模式进行比较defhttp_error(status):matchstatus:case400:return"Bad请求”case401:返回“Unauthorized”case403:返回“Forbidden”case404:返回“Notfound”case418:返回“I'mateapot”case_:返回“Somethingelse”最后一个case,case_:类似于C和Java中的default:,match永远不会失败,即当其他情况无法匹配时,match2可以使用|tocombinmultipleliteralstoexpressor...case401|403|404:return"Notallowed"3mode也可以是拆包操作,用于绑定变量#主体表达式是一个(x,y)元组匹配点:case(0,0):print("原点")case(0,y):print(f"Y={y}")case(x,0):print(f"X={x}")case(x,y):打印(f"X={x},Y={y}")case_:raiseValueError("Notapoint")注意第一种方式有两个字面量,可以看成是对上面的增强——提到了普通模式版本,但后两种模式有些不同。其中一个元组是文字,另一个是变量,它捕获主题元组中的值。同理,第四种模式case(x,y):会抓取两个值,理论上和解包作业类似,如point(x,y)=point4如果使用结构化数据类,如dataclasses,即可以类似于构造函数'类名+参数列表'的形式使用,但用于从数据类中捕获变量importdataclass@dataclassclassPoint:x:inty:intdefwhereis(point):matchpoint:casePoint(0,0):print("Origin")casePoint(0,y):print(f"Y={y}")casePoint(x,0):print(f"X={x}")casePoint():print("Somewhereelse")case_:print("Notapoint")5也可以使用关键字参数。y,var的以下模式都是等效的,并将属性绑定到变量Point(1,var)Point(1,y=var)Point(x=1,y=var)Point(y=var,x=1)6模式可以简单粗暴地嵌套。例如,如果我们有一个点列表,我们可以像这样匹配匹配点:case[]:print("Nopoints")case[Point(0,0)]:print("Theorigin")case[Point(x,y)]:print(f"单点{x},{y}")case[Point(0,y1),Point(0,y2)]:print(f"Y轴上的两个点{y1},{y2}")case_:print("Somethingelse")7将if子句添加到模式中以充当看门人。如果为假,则继续下一个案例。请注意,模式捕获值发生在子句匹配点执行之前:casePoint(x,y)ifx==y:print(f"Y=Xat{x}")casePoint(x,y):print(f"Notonthediagonal")8子模式可以用作捕获案例(Point(x1,y1),Point(x2,y2)asp2):...9patterns可以使用命名常量,并且必须用于防止从枚举中解释为捕获变量importEnumclassColor(Enum):RED=0GREEN=1BLUE=2matchcolor:caseColor.RED:print("Iseered!")caseColor.GREEN:print("Grassisgreen")caseColor.BLUE:print("I'mfeelingtheblues:(")10个字面值会被特殊处理,比如None,False,True,is用于完成匹配。例如:matchb:caseTrue:print("Yes!")完全等价于这个...ifbisTrue:print("Yes!")最近整理了几百G的Python学习资料,包括电子书、教程、视频等,免费分享给大家!想上gong~hao“Python编程学习圈”就送“J”到免费获取