模式匹配
在上一篇中我们介绍了条件判断的使用方法,而如果我们使用多次if...elif...elif...else判断时候会造成代码过于繁杂
所以在针对某个变量匹配若干种情况时,我们一般使用match
语句
例如某个学生的成绩分别是A,B,C,那么使用条件判断的话我们写出来的代码是
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 number')
但是这样显然是过于复杂了,所以我们使用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('socre is unknow')
在使用match
语句中,我们依次使用match xxx
来进行匹配,并能且仅能在最后一项中添加case _
来表示else
的含义。相比于if...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('idk')
在第一个匹配中,case x if x<10
表示当年龄小于10的时候进行匹配,并且对x
进行赋值,第二个case
匹配为单个值,第三个匹配为多个值,中间使用|
来进行分割
因此match
的case
非常灵活
同时我们还能使用match
来匹配列表
args = ['gcc','hello.c','world.c']
match args:
case ['gcc']:
print('gcc:missing source files')
case ['gcc',file1,*files]:
print('gcc compile: ' + file1 + ', ' + ', '.join(files))
case ['clean']:
print('clean')
case _:
print('invalid command')
- args 列表:
args
是一个包含命令行参数的列表。在这个例子中,args = ['gcc', 'hello.c', 'world.c']
表示用户希望使用gcc
编译两个C源文件:hello.c
和world.c
。
- 模式匹配结构:
match args:
语句用于开始模式匹配。args
是要匹配的对象,它是一个列表。case
语句用于定义不同的匹配模式,每个模式对应一个特定的结构。
- 各个 case 语句的解释:
case ['gcc']:
:- 这个模式匹配一个只包含单个元素
'gcc'
的列表。 - 如果
args
仅仅是['gcc']
,则会执行print('gcc:missing source files')
,提示用户缺少源文件。
- 这个模式匹配一个只包含单个元素
case ['gcc', file1, *files]:
:- 这个模式匹配以
'gcc'
开头,并且后面至少有一个文件名的列表。 file1
匹配第一个文件名,*files
使用星号解包语法,匹配剩余的所有文件名(如果有的话)。- 如果
args
是['gcc', 'hello.c', 'world.c']
,则file1
为'hello.c'
,files
为['world.c']
。 - 执行
print('gcc compile: ' + file1 + ', ' + ', '.join(files))
,输出gcc compile: hello.c, world.c
。
- 这个模式匹配以
case ['clean']:
:- 这个模式匹配一个只包含单个元素
'clean'
的列表。 - 如果
args
是['clean']
,则会执行print('clean')
。
- 这个模式匹配一个只包含单个元素
case _:
:_
是一个通配符,匹配所有未被前面模式捕获的情况。- 如果
args
不符合任何前面的模式,则执行print('invalid command')
,表示输入的命令无效。
循环
我们在进行运算时,经常会用到循环来简化代码
毕竟你也不想手动输入计算1+2+3+...+2020
吧
那我们使用循环来辅助进行计算就显得很有必要了
在python的循环中,我们一般使用两种方式,一种是for...in...
的循环,即依次把list和tuple中的每个元素迭代出来
names = ['Andy','Udon','Deemoe']
for name in names:
print(name)
然后我们就会打印得到
Andy
Udon
Deemoe
因此在for x in...
语句中,我们可以理解为将每个元素带入变量x
并且执行缩进块的语句
这时候我们就可以回答开头的那个问题了——如何使用循环来计算从1相加至2020呢
我们首先使用range(n)
函数来生成一个从0到n-1的整数序列,例如想要生成1到2020就是range(2021)
,然后我们使用list()
来将这个整数序列转换为列表
sum = 0
for x in range(2021):
sum = sum + x
print(sum)
这里的sum = sum + x
表示在每次循环中,将当前的整数 x
加到 sum
中。
而除了for...in...
循环,我们还可以使用while
进行循环,while
循环的特征是只要条件满足,便会持续进行循环
比如我们要计算从1到100之内所有奇数之和时
sum = 0
n = 99
while n > 0:
sum = sum + n
n = n - 2
print(sum)
在循环内部变量n
不断自减,直到变为-1
时,不再满足while条件,循环退出。
而我们可以使用break
和continue
命令来进行中断和继续操作
-
continue
在循环过程中,我们通过使用
continue
语句,跳过本次循环,直接开始进行下一次循环n = 0 while n < 10: n = n + 1 if n % 2 == 0: #当n是偶数时,进行continue语句 continue #当continue语句执行时,跳过print继续进行循环 print(n)
-
break
在循环过程中,我们通过使用
break
语句,中断本次循环n = 1 while n <= 100: if n > 10: # 当n = 11时,条件满足,执行break语句 break # 通过使用break语句结束本次循环 print(n) n = n + 1 print('end')
仍然需要注意的是,在日常使用过程中我们尽量不去使用break
和continue
语句,因为它们会让代码产生过多的执行分叉逻辑,从而降低代码的可读性。