博主信息
博文 6
粉丝 0
评论 0
访问量 8752
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
Python重大变化:是match-case,不是switch-case
P粉379686903
原创
662人浏览过

前言
2021 年 2 月 8 日,指导委员会通过了 PEP 634, PEP635, PEP636,至此,Python 总算拥有了 match-case, 不用再写一连串的 if-else 了

1
最简单的形式如下,将 match 主题表达式与一个或多个字面量模式进行比较

  1. def http_error(status):
  2. match status:
  3. case 400:
  4. return "Bad request"
  5. case 401:
  6. return "Unauthorized"
  7. case 403:
  8. return "Forbidden"
  9. case 404:
  10. return "Not found"
  11. case 418:
  12. return "I'm a teapot"
  13. case _:
  14. return "Something else"

最后一个 case 中,case _:类似于 C 和 Java 中的default:,永远不会匹配失败,即当其他 case 都无法匹配时,匹配这条

2
可以使用|将多个字面量组合起来表示或

  1. ...
  2. case 401|403|404:
  3. return "Not allowed"

3
模式也可以是解包操作,用于绑定变量

  1. # 主题表达式是一个(x, y)元组
  2. match point:
  3. case (0, 0):
  4. print("Origin")
  5. case (0, y):
  6. print(f"Y={y}")
  7. case (x, 0):
  8. print(f"X={x}")
  9. case (x, y):
  10. print(f"X={x}, Y={y}")
  11. case _:
  12. raise ValueError("Not a point")

注意,第一个模式中有两个字面量,可以看作是上述普通模式的加强版。但是后两个模式有些不同,元组中一个是字面量一个是变量,这个变量会捕获主题元组中的值。同理,第四个模式case (x, y):会捕获两个值,这在理论上与解包作业相似,就如同point(x, y) = point

4
如果使用了结构数据类,比如data classes,可以用类似于构造函数’类名+参数列表’的形式,但是用来捕获变量

  1. from dataclasses import dataclass
  2. @dataclass
  3. class Point:
  4. x: int
  5. y: int
  6. def whereis(point):
  7. match point:
  8. case Point(0, 0):
  9. print("Origin")
  10. case Point(0, y):
  11. print(f"Y={y}")
  12. case Point(x, 0):
  13. print(f"X={x}")
  14. case Point():
  15. print("Somewhere else")
  16. case _:
  17. print("Not a point")

5
也可以使用关键字参数。下列关于y, var的模式都是等价的,并且都将属性绑定到了变量上

  1. Point(1, var)
  2. Point(1, y=var)
  3. Point(x=1, y=var)
  4. Point(y=var, x=1)

6
模式可以被简单粗暴的嵌套起来,例如我们有一组 points 的列表,就可以像这样匹配

  1. match points:
  2. case []:
  3. print("No points")
  4. case [Point(0, 0)]:
  5. print("The origin")
  6. case [Point(x, y)]:
  7. print(f"Single point {x}, {y}")
  8. case [Point(0, y1), Point(0, y2)]:
  9. print(f"Two on the Y axis at {y1}, {y2}")
  10. case _:
  11. print("Something else")

7
给模式添加 if 从句以充当门卫。如果为假,就移步到下一个 case。注意,模式捕获值发生在从句执行前

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

8
子模式可以使用as捕获

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

9
模式可以使用命名的常量,且必须使用.以防止被解释为捕获变量

  1. from enum import Enum
  2. class Color(Enum):
  3. RED = 0
  4. GREEN = 1
  5. BLUE = 2
  6. match color:
  7. case Color.RED:
  8. print("I see red!")
  9. case Color.GREEN:
  10. print("Grass is green")
  11. case Color.BLUE:
  12. print("I'm feeling the blues :(")

10
字面量会被特殊对待,例如None, False, True,是使用is完成匹配的

例如:

  1. match b:
  2. case True:
  3. print("Yes!")

就完全等价于这样

  1. ...
  2. if b is True:
  3. print("Yes!")

最近整理了几百 G 的 Python 学习资料,包含电子书、教程、视频等等,免费分享给大家!希望对大家有所帮助学习,

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学