专业的JAVA编程教程与资源

网站首页 > java教程 正文

Python3.10版本新增语法——结构模式匹配简介

temp10 2024-11-16 00:43:20 java教程 12 ℃ 0 评论

Python最新正式版本3.10在10月4日已经发布。这个版本从2020年5月开始开发,经历差不多一年半的时间终于正式发布。当然每一个新版本都有很多新功能。我们将持续关注新功能,在这篇文章中,我们将简述3.10中新功能中的语法——结构模式匹配(structural pattern matching)。



Python3.10版本新增语法——结构模式匹配简介

  • 一、概述
  • 二、Literal patterns
  • 三、Wildcard patterns
  • 四、Sequence Patterns
  • 五、Mapping Patterns
  • 六、Class Patterns
  • 七、Capture patterns
  • 八、OR Patterns
  • 九、AS Patterns

一、概述

Python3.10新增语法主要是新增支持结构模式匹配(structural pattern matching)语法(PEP 636)。

这个匹配其实类似于C++/Java中的switch语句,也就是根据匹配到的情况选择执行后面的程序。不过,结构模式匹配支持类似正则匹配的方式来匹配cases。

这个语法用法如下:

match expression:
    case pattern1: # do something
    case pattern2: # do something else

这里的pattern1和pattern2支持很多类型,我们一一说明。

二、Literal patterns

字面匹配,就是数字、字符这种简单类型。示例如下:

def weekday_name(weekday_num):
    match weekday_num:
        case 1:
            return "Monday"
        case 2:
            return "Tuesday"
        case 3:
            return "Wednesday"
        case 4:
            return "Thursday"
        case 5:
            return "Friday"
        case 6:
            return "Saturday"
        case 7:
            return "Sunday"

三、Wildcard patterns

通配符匹配,就是英文单下划线“_”的匹配,表示不符合其它任意一种情况。示例如下:

def weekday_name(weekday_num):
    match weekday_num:
        case 1:
            return "Monday"
        case 2:
            return "Tuesday"
        case 3:
            return "Wednesday"
        case 4:
            return "Thursday"
        case 5:
            return "Friday"
        case 6:
            return "Saturday"
        case 7:
            return "Sunday"
        case _:
            return "Invalid. weekday_num should be an integer between 1 and 7"

四、Sequence Patterns

序列匹配,就是根据匹配到的序列情况来返回结果。如下例子:

def rank_candidates(candidates):
    match candidates:
        case [first]: # when num of candidates is 1
            return {"first": first}

        case [first, second]: # when num of candidates is 2
            return {"first": first, "second": second}

        case [first, second, third]: # when num of candidates is 3
            return {"first": first, "second": second, "third": third}

        case [first, second, third, *rest]: # when num of candidates is >3
            return {"first": first, "second": second, "third": third}

其实就是看列表长度和列表元素情况。

五、Mapping Patterns

匹配mapping模式,例子如下:

for repo in repositories:
    match repo:
        case {"language": "Python", "name": name}:
            print(name)

就是说找到repositories中的dict,其中必须是包含”language”: “Python”这个键值对,同时必须包含一个key是name,但value可以是其它任意内容的结果,最终输出name。

六、Class Patterns

就是类型匹配,话不多说,例子如下:

def sum_two_integers(num1, num2):
    match num1, num2:
        case int(num1), int(num2):
            return num1 + num2

当num1和num2都是整型的时候,返回相加结果。

七、Capture patterns

捕获模式,也就是从某个列表中获取对应的元素。

name = "Tarzan Mbogi Genje"

match name.split():
    case first_name, second_name, third_name:
        print(f"First name: {first_name}" )

八、OR Patterns

OR模式由两个或更多的模式组成,用竖条分隔。要使模式成功,其中一个模式必须匹配。如果两个模式都不匹配,则匹配失败。

def check_type(val):
    match val:
        case str(val):
            return "String"
        case int(val) | float(val):
            return "Number"

九、AS Patterns

AS模式允许我们指定一个结构约束并同时绑定到一个值。也就是某些情况在一个case中可以匹配到多个模式。

def check_type(val):
    match val:
        case str() as val:
            return "String"
        case int() | float() as val:
            return "Number"

「链接」

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表