模式匹配

维基百科,自由的百科全书
跳到导航 跳到搜索

计算机科学中模式匹配是检查给定标记序列中是否存在某种模式的组成部分的行为。与模式识别相反,匹配通常必须是精确的。模式通常具有序列树结构的形式。模式匹配的用途包括输出一个模式在一个标记序列中的位置(如果有的话),输出匹配模式的一些组成部分,以及用一些其他的标记序列(即搜索和替换)替换匹配模式。

定义[编辑]

Python3.10[1],模式匹配的语法应该是:

match subject:
    case <pattern_1>:
        <action_1>
    case <pattern_2>:
        <action_2>
    case <pattern_3>:
        <action_3>
    case _:
        <action_wildcard>

其中 subject表示原始数据,<pattern_*>表示不同模式,_表示通配符,如果在上文中没有找到精确匹配的对象,将会使用通配符。如果一个模式匹配没有精确匹配上且没有通配符,整个语句不做任何作用(no-op)。

例子[编辑]

Python3.10[2]

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"

如果省略最后两行,当status为500时什么都不会发生。

同理,模式匹配也可用于class中:

class Point:
    x: int
    y: int


def location(point):
    match point:
        case Point(x=0, y=0):
            print("Origin is the point's location.")
        case Point(x=0, y=y):
            print(f"Y={y} and the point is on the y-axis.")
        case Point(x=x, y=0):
            print(f"X={x} and the point is on the x-axis.")
        case Point():
            print("The point is located somewhere else on the plane.")
        case _:
            print("Not a point")

和其他语言中的模式匹配一样,Python中也可以在匹配的语句中使用通配符:

match test_variable:
    case ('warning', code, 40):
        print("A warning has been received.")
    case ('error', code, _):
        print(f"An error {code} occurred.")

引用[编辑]

  1. ^ What's New In Python 3.10 — Python 3.10.0b2 文档. docs.python.org. [2021-06-17]. 
  2. ^ What's New In Python 3.10 — Python 3.10.0b2 文档. docs.python.org. [2021-06-17].