5.5 match语句

深入学习Python match语句和模式匹配,包括基本匹配语法、复杂匹配规则、列表匹配等高级用法,掌握Python 3.10新增的模式匹配特性,提升代码的可读性和维护性。

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 语句的匹配规则灵活,可以写出简洁的代码。