关于我转生开始学python的那件事(五)——模式匹配与循环

模式匹配

在上一篇中我们介绍了条件判断的使用方法,而如果我们使用多次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匹配为单个值,第三个匹配为多个值,中间使用|来进行分割

因此matchcase非常灵活

同时我们还能使用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')
  1. args 列表
    • args 是一个包含命令行参数的列表。在这个例子中,args = ['gcc', 'hello.c', 'world.c'] 表示用户希望使用 gcc 编译两个C源文件:hello.cworld.c
  2. 模式匹配结构
    • match args: 语句用于开始模式匹配。args 是要匹配的对象,它是一个列表。
    • case 语句用于定义不同的匹配模式,每个模式对应一个特定的结构。
  3. 各个 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条件,循环退出。

而我们可以使用breakcontinue命令来进行中断和继续操作

  1. continue

    在循环过程中,我们通过使用continue语句,跳过本次循环,直接开始进行下一次循环

    n = 0
    while n < 10:
       n = n + 1
       if n % 2 == 0: #当n是偶数时,进行continue语句
           continue #当continue语句执行时,跳过print继续进行循环
       print(n)
  2. break

    在循环过程中,我们通过使用break语句,中断本次循环

    n = 1
    while n <= 100:
       if n > 10: # 当n = 11时,条件满足,执行break语句
           break # 通过使用break语句结束本次循环
       print(n)
       n = n + 1
    print('end')

仍然需要注意的是,在日常使用过程中我们尽量不去使用breakcontinue语句,因为它们会让代码产生过多的执行分叉逻辑,从而降低代码的可读性。

博客内容均系原创,未经允许严禁转载!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇