1.引言
在日常生活中,我们会去做一些假设性的事情,或者重复性的行为,这些都属于人类的基本认知能力。那么编程语言同理,会需要做一些假设以及重复性,这即是流程控制要解决的问题域。
在python中,流程控制语句用于控制代码的执行顺序,主要涉及内容:条件判断,模式匹配,循环结构,流程控制关键字。
下面来详细看。
2.流程控制
2.1.条件判断语句(if)
if语句用于根据条件决定执行代码块:
- if:当条件为True时,执行
- elif(可选):当上一个条件不满足时,匹配检查新条件
- else(可选):当所有条件都不满足时,执行
代码示例:
python
#最基础的if
if True:
print("我喜欢真理!")
# 带elif的if
if False:
print("我不喜欢歪理!")
elif True:
print("所以,最终我还是喜欢真理!")
# 带else的if
if False:
print("我不喜欢歪理!")
else:
print("跟上面一样,我依然喜欢真理!")
以上示例代码直接使用True和False布尔值,简化了条件判断逻辑。在实际项目中,条件判定部分,通常会结合:比较运算符,逻辑运算符,成员运算符一起使用。
比较运算符:
逻辑运算符:
成员运算符:
2.2.模式匹配语句(match)
python中模式匹配match语句,类似于其它编程语言中的switch语句,如果你熟悉scala编程语言(著名kafka消息系统实现语言),它们俩有异曲同工之妙。几个关注点如下:
- 一方面你看其它编程语言中的switch叫做分支判断,而python中的match叫做模式匹配,能力更强大,适应于更多场景
- python中的match语句,在3.10发布版本中才提供的一个新特性,要求你的python解释环境要大于等于3.10版本
- 以下案例为了让match语句更全面性,提前预告了一些超纲知识点,不过没有关系,你先了解一下可以这么用,到相应知识点的时候都会详细讲解
2.2.1.基础匹配,值匹配
python
# 基础匹配,匹配不同内置数据类型值
def match_inner_type(value):
match value:
case 1:
print("匹配到整数 1")
case "hello":
print("匹配到字符串 'hello'")
case [x, y, z]:
print(f"匹配到包含三个元素的列表,元素为: {x}, {y}, {z}")
case _:
print("未匹配到已知模式")
# 输出: 匹配到整数 1
match_inner_type(1)
# 输出: 匹配到字符串 'hello'
match_inner_type("hello")
# 输出: 匹配到包含三个元素的列表,元素为: 4, 5, 6
match_inner_type([4, 5, 6])
# 输出: 未匹配到已知模式
match_inner_type(3.14)
2.2.2.类型匹配
python
# 类型匹配,匹配内置类型
def match_type(data):
match data:
case int():
print("匹配到整数")
case str() as s if len(s) > 5: # 结合守卫条件 (guard clause)
print(f"匹配到长度超过 5 的字符串: {s}")
case list() | tuple(): # 匹配列表或元组
print("匹配到序列类型")
case _:
print("未知类型")
# 输出: 匹配到整数
match_type(42)
# 输出: 匹配到长度超过 5 的字符串: Python
match_type("Python")
# 输出: 匹配到序列类型
match_type((1, 2))
# 输出: 未知类型
match_type({"key": "value"})
2.2.3.解包嵌套结构
python
# 解包嵌套结构
def process_nested(data):
match data:
case {"user": name, "scores": [math, physics]}:
print(f"用户 {name} 的数学成绩: {math}, 物理成绩: {physics}")
case {"error": code, "message": msg}:
print(f"错误 {code}: {msg}")
case _:
print("无效数据")
# 测试数据
data1 = {"user": "Alice", "scores": [90, 85]}
data2 = {"error": 404, "message": "Not Found"}
# 输出: 用户 Alice 的数学成绩: 90, 物理成绩: 85
process_nested(data1)
# 输出: 错误 404: Not Found
process_nested(data2)
实现数据解包匹配,这个能力可以点个赞!
2.2.4.匹配类实例
python
# 匹配类实例
#定义类,超纲知识点了
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
# 定义匹配函数
def describe_point(point):
match point:
case Point(x=0, y=0):
print("原点")
case Point(x=0) if point.y > 0: # 匹配 x=0 且 y 为正数的点
print("Y 轴正方向上的点")
# 创建实例
p1 = Point(0, 0)
p2 = Point(0, 5)
# 输出: 原点
describe_point(p1)
# 输出: Y 轴正方向上的点
describe_point(p2)
2.2.5.通配符匹配
python
# 结合通配符
def handle_command(command):
match command.split():
case ["exit"]:
print("退出程序")
case ["load", filename]:
print(f"加载文件: {filename}")
case ["save", *files]: # 匹配任意数量的参数
print(f"保存文件列表: {files}")
case _:
print("未知命令")
# 输出: 退出程序
handle_command("exit")
# 输出: 加载文件: data.txt
handle_command("load data.txt")
# 输出: 保存文件列表: ['a.txt', 'b.txt']
handle_command("save a.txt b.txt")
2.3.循环语句(while)
while循环语句,用于在条件满足时重复执行一段代码块,直到条件变为False。基本语法结构:
python
while 条件表达式:
循环体代码
执行流程:
- 检查条件表达式是否为True
- 如果为True,执行循环体代码
- 重复上述两个步骤,直到条件变为False
示例:
python
count = 1
while count <= 5:
print(count) # 输出 1 到 5
count += 1 # 更新条件变量
2.4.循环语句(for)
for循环语句,用于遍历可迭代对象:列表,字符串,字典,集合,生成器。按顺序处理元素。语法结构:
python
for 变量 in 可迭代对象:
循环体代码
执行流程:
- 依次从可迭代对象中取出元素
- 将元素赋值给变量
- 执行循环体代码
- 重复直到所有元素被遍历
示例:
python
# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
# 遍历字符串
text = "Hello"
for char in text:
print(char)
# 集合range函数
# 遍历 0~4
for i in range(5):
print(i) # 输出: 0 1 2 3 4
# 遍历 2~5(不包含5)
for i in range(2, 5):
print(i) # 输出: 2 3 4
# 步长为2
for i in range(0, 10, 2):
print(i) # 输出: 0 2 4 6 8
# 遍历字典
person = {"name": "小明", "age": 25, "city": "广州"}
# 遍历键
for key in person:
print(key) # 输出: name → age → city
# 遍历键值对
for key, value in person.items():
print(f"{key}: {value}")
2.5.循环while VS 循环for
既生瑜何生亮!既然有了while循环语句,怎么还要有for循环语句呢?我们说存在即合理,虽然都是循环语句,但各自有各自的特点和适用场景。
2.6.流程控制关键字(continue,break,pass)
流程控制语句中,有时候我们需要打破常规执行流程,这个时候可以配套流程控制关键字一起实现。
- continue:跳过当前迭代的剩余代码,直接进入下一次循环
python
num = 0
while num < 5:
num += 1
if num % 2 == 0:
continue # 跳过偶数
print(num) # 输出 1, 3, 5
- break: 立即终止整个循环,跳出循环体
python
while True:
user_input = input("输入 'exit' 退出:")
if user_input == "exit":
break # 退出循环
print("你输入了:", user_input)
- pass:什么也不做,预留位置
python
# 占位未实现函数
def future_feature():
pass # 待后续补充代码
# 定义空异常处理块
try:
x = 1 / 0
except ZeroDivisionError:
pass # 忽略错误(实际开发中谨慎使用!)
# 保持代码结构完整
if condition1:
do_something()
elif condition2:
pass # 占位,避免语法错误
else:
do_another_thing()