用 if ... elif ... elif ... else ... 判断时,会写很长一串代码。
针对某个变量匹配若干种情况,可以用 match 语句。
比如某个学生的成绩只能是 A、B、C,用 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 语句的匹配规则灵活,可以写出简洁的代码。