阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

模式匹配

27次阅读
没有评论

共计 1462 个字符,预计需要花费 4 分钟才能阅读完成。

当我们用 if ... elif ... elif ... else ... 判断时,会写很长一串代码,可读性较差。

如果要针对某个变量匹配若干种情况,可以使用 match 语句。

例如,某个学生的成绩只能是 ABC,用if 语句编写如下:

score = 'B'
if score == 'A':
    print('score is A.')
elif score == 'B':
    print('score is B.')
elif score == 'C':
    print('score is C.')
else:
    print('invalid score.')

如果用 match 语句改写,则改写如下:

score = 'B'

match score:
    case 'A':
        print('score is A.')
    case 'B':
        print('score is B.')
    case 'C':
        print('score is C.')
    case _: # _表示匹配到其他任何情况
        print('score is ???.')

使用 match 语句时,我们依次用 case xxx 匹配,并且可以在最后(且仅能在最后)加一个 case _ 表示“任意值”,代码较 if ... elif ... else ... 更易读。

复杂匹配

match语句除了可以匹配简单的单个值外,还可以匹配多个值、匹配一定范围,并且把匹配后的值绑定到变量:

age = 15

match age:
    case x if x < 10:
        print(f'< 10 years old: {x}')
    case 10:
        print('10 years old.')
    case 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18:
        print('11~18 years old.')
    case 19:
        print('19 years old.')
    case _:
        print('not sure.')

在上面这个示例中,第一个 case x if x < 10 表示当 age < 10 成立时匹配,且赋值给变量 x,第二个case 10 仅匹配单个值,第三个 case 11|12|...|18 能匹配多个值,用 | 分隔。

可见,match语句的 case 匹配非常灵活。

匹配列表

match语句还可以匹配列表,功能非常强大。

我们假设用户输入了一个命令,用 args = ['gcc', 'hello.c'] 存储,下面的代码演示了如何用 match 匹配来解析这个列表:

args = ['gcc', 'hello.c', 'world.c']
# args = ['clean']
# args = ['gcc']

match args:
    # 如果仅出现 gcc,报错:
    case ['gcc']:
        print('gcc: missing source file(s).')
    # 出现 gcc,且至少指定了一个文件:
    case ['gcc', file1, *files]:
        print('gcc compile:' + file1 + ',' + ','.join(files))
    # 仅出现 clean:
    case ['clean']:
        print('clean')
    case _:
        print('invalid command.')

第一个 case ['gcc'] 表示列表仅有 'gcc' 一个字符串,没有指定文件名,报错;

第二个 case ['gcc', file1, *files] 表示列表第一个字符串是 'gcc',第二个字符串绑定到变量file1,后面的任意个字符串绑定到*files(符号* 的作用将在函数的参数中讲解),它实际上表示至少指定一个文件;

第三个 case ['clean'] 表示列表仅有 'clean' 一个字符串;

最后一个 case _ 表示其他所有情况。

可见,match语句的匹配规则非常灵活,可以写出非常简洁的代码。

参考源码

do_match.py

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-08-07发表,共计1462字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中