程序结构

计算机在解决问题时,主要有3种情形,分别是顺序执行所有的语句、选择执行部分语句和循环执行部分语句,这3种情形分别对应3个结构,即:

  • 顺序结构
  • 选择结构
  • 循环结构

Pasted image 20250707180721

选择语句

Python中使用ifelifelse保留字来组成选择语句,其语法格式如下:

  1. 最简单的 if 语句,表达式可以是单纯的bool类型或变量,也可以是比较表达式逻辑表达式。使用if语句时,若只有一条语句,则可以将语句块直接写到冒号:的右侧。如:if a>b:max=a
if 表达式:
    语句块
  1. if...else语句,简单的可以理解为“如果……否则……”,即二选一的条件。else不可以单独使用,它必须和保留字if一起使用,if根据缩进判断相对应的else,例如if语句的嵌套。
if 表达式:
    语句块1
else:
    语句块2

if...else语句可以使用条件表达式进行简化,如下面示例:

a = -1
if a > 0:
    b = a
else:
    b= -a
print(b)

"""上述代码可以简化为"""

a = -1
b = a if a > 0 else -a
print(b)
  1. if...elif...else语句,该语句是一个多分支选择结构。ifelif都需要判断真假,而else不需要判断,elifelse都必须和if一起使用,不能单独使用。
if 表达式1:
    语句块1
elif 表达式2:
    语句块2
elif 表达式3:
    语句块3
...
else:
    语句块n

使用if选择语句时,要遵循以下原则:

  • 使用布尔型变量作为判断条件时,规范书写为:if 变量名: # 为真if not 变量名: # 为假;不要写成if 变量名 == True(/False): # 不规范书写
  • 注意区分===的区别,别将条件判断的==错写成=
  1. 选择语句的嵌套,3种形式的选择语句之间都可以互相嵌套,如 if语句 嵌套 if...else语句if...else语句 嵌套 if...else语句 的代码如下所示:
""" if语句 嵌套 if...else语句 """
if 表达式:
    if 表达式1:
        语句块1
    else 表达式2:
        语句块2
""" if...else语句 嵌套 if...else语句 """
if 表达式1:
    if 表达式2:
        语句块1
    else:
        语句块2
else:
    if 表达式3:
        语句块3
    else:
        语句块4

循环语句

循环的两种类型:

  • 计次循环(如for循环)
  • 条件循环(如while循环)

while循环是通过一个条件来控制是否要继续反复执行循环体中的语句。其语法格式如下:

while 条件表达式:
    循环体(被重复执行的语句)
注意:使用while循环时一定不要忘记添加将循环条件改变为False的代码,否则将会产生死循环

for循环是一个计次循环,一般用于循环次数已知的情况下。通常用于枚举遍历序列,以及迭代对象的元素。其语法如下:

for 迭代变量 in 对象:
    循环体

迭代变量用于保存读取出的值;对象为要遍历或迭代的对象,该对象可以是任何有序的序列对象,如字符串、列表、元组等,循环体是需要重复执行的语句。

数值循环range(start,end,step)内置函数介绍:

  • start:指定计数的起始值,可以省略,默认从0开始
  • end:指定计数的结束值(不包含结束值),该值不能省略
  • step:用于指定步长,可以省略,默认步长为1

range()函数中,若只存在1个参数,则表示指定的是end;若存在2个参数,则表示指定的startend;只有3个参数同时存在,最后一个参数才表示step步长

示例:

for i in range(1,7,2):
    print(i)
'''输出结果为:1、3、5'''
for i in range(5):
    print(i)
'''输出结果为:0、1、2、3、4'''
for i in range(2,5):
    print(i)
'''输出结果为:2、3、4'''

python允许在一个循环体中嵌入另一个循环,这称为循环嵌套,其中for循环while循环 可以相互嵌套使用,例如:

while 条件表达式:
    for 迭代变量 in 对象:
        循环体2
    循环体1

break、continue 和 pass 语句

在程序中存在未迭代完对象而退出循环或未满足循环条件而退出循环的方法:

  • 使用continue可以跳过本次循环进入下一次迭代
  • 使用break可以完全终止循环

Python中存在一个用于保持程序结构完整性的pass语句

break语句可以终止当前的循环,包括whilefor在内的所有控制语句。break语句一般与if搭配使用(breakif语句块内),例如在while语句中使用break语句的示例:

a = 0
while a < 10:
    a+=1
    if a == 3:
        break
print(a)   # 最后的输出结果为3

while语句for语句 中使用 break 的语法结构:

"""while循环与break"""
while 条件表达式1:
    执行代码
    if 条件表达式2:
        break
        
"""for循环与break"""
for 迭代变量 in 对象:
    执行代码
    if 条件表达式:
        break

continue语句 只能中止本次循环而提前进入下一次循环,若使用循环嵌套,则continue只跳过最内层循环中的剩余语句。while语句for语句 中使用 continue 的语法结构:

"""while循环与continue"""
while 条件表达式1:
    执行代码
    if 条件表达式2:
        continue
        
"""for循环与continue"""
for 迭代变量 in 对象:
    执行代码
    if 条件表达式:
        continue

for循环continue 的使用示例:

for i in range(7):
    if i % 2 == 0:
        continue  # 若i为偶数则跳过本次循环
    print(i,end=" ")
"""最后的输出结果为:1 3 5 """

pass语句 表示为空语句,pass语句 不做任何事情,一般起到占位作用。如输出0~10之间的偶数,若非偶数,则可以使用pass占个位置,代码如下:

for i in range(11):
    if i % 2 == 0:    # 为偶数则进行输出
        print(i)
    else:             # 非偶数则不做任何事
        pass

match...case语句

match...case语句 称为结构化模式匹配语句。该语句可以实现与if...elif...else语句 相似的多分支选择结构的功能。除此之外它还可以轻松匹配列表、元组、字典、类以及其他更复杂的结构,其通用语法如下:

match subject:
    case pattern_1:
        action_1
    case pattern_2:
        action_2
    ...
    case pattern_n:
        action_n
    case _:
        action_wildcard
  • subject:必选参数,用于指定具有特定类型的数据如数字、字符串、列表、元组等
  • pattern_(1-n):参数中的一个值,用于进行模式匹配,执行过程中从上到下依次进行比较,直到匹配到一个模式后结束匹配
  • action_(1-n):指定要执行的与被匹配的模式相关联的动作
  • _ 和 action_wildcard:可选参数,用于指定当前面的case语句不能完全匹配时所使用的通配符,该case语句将被作为已匹配模式,从而执行action_wildcard所绑定的动作,若该参数不存在,则当前面的case语句不能完全匹配时,该match语句将无任何操作。

匹配字面值

def if_light(color):
    if color == 'red':
        return 'Stop'
    elif color == 'yellow':
        return 'Caution'
    elif color == 'green':
        return 'Go'
    else:
        return 'Invalid color'

print(if_light('red'))

将上述代码使用match语句进行改写可以得到:

def match_light(color):
    match color:
        case 'red':
            return 'Stop'
        case 'yellow':
            return 'Caution'
        case 'green':
            return 'Go'
        case _:
            return 'Invalid color'

print(match_light('red'))

绑定变量

def if_point(point: tuple):
    if len(point) == 2:
        if point[0] == 0 and point[1] == 0:
            print('Origin')
        else:
            print(f"x={point[0]},y={point[1]}")
    else:
        print(f"{point} is not a valid point!")

将上述代码使用match语句改写后得到:

def match_point(point: tuple):
    match point:
        case (0,0):
            print('Origin')
        case (x,y):
            print(f'{x=},{y=}')  # 此处的{x=}这种形式为调试友好格式化语法,等同于x={x}
        case other: # 下划线不能进行变量名绑定,而变量可以
            print(f'{other} is not a valid point!')

约束项(if语句)

可以在case语句的后面接上if进行约束,若条件匹配为真,则执行该case的匹配,反之,则继续寻找下一个case匹配项。如下示例:

point = eval(input("please entry point: "))
match point:
    case (x,y) if x > y:
        print(x,y,'x大于y')
    case (x,y) if x < y:
        print(x,y,'x小于y')
    case (x,y):
        print(x,y,'x等于y')

匹配字典

匹配字典中的键值对,只匹配case中所提到的键,不管字典的其他键

dic = {'x': 20, 'y': 30, 'z': 40}
match dic:
    case {'x': 20}:
        print('success')

若想获取case未提到的键值对,则可以使用通配符**进行获取

dic = {'x': 20, 'y': 30, 'z': 40}
match dic:
    case {'x': 20, **other}:
        print(other)   # 输出结果为:{'y': 30, 'z': 40}

若想获取键值对的值,则可以使用变量进行匹配

dic = {'x': 20, 'y': 30, 'z': 40}
match dic:
    case {'x': a, 'y': b, 'z': c}:
        print(a,b,c)   # 输出结果为:20 30 40

类模式匹配

class Point:
    def __init__(self,x,y):
        self.x = x
        self.y = y

"""此处也可以是使用__match_args__ = ()来指定在match...case中位置表示的参数"""

p = Point(0,1)
match p:
    case Point(x=0,y=0): # case中构造Point对象时必须使用关键字传参
        print('Origin')
    case Point(x=x ,y=y):
        print(f"{x=},{y=}")