第3章 控制流程¶
在程序中,控制流程(Control Flow)决定了代码按什么顺序执行。掌握条件判断与循环,可以让你的程序根据不同情况执行不同的分支,并对数据进行高效处理。
本系列文章所使用到的示例源码:Python从入门到精通示例代码
3.1 条件语句(if、elif、else)¶
3.1.1 基本概念与语法¶
条件语句用于根据布尔条件(True/False)选择性地执行代码块。
- 单分支(if)
age = 20
if age >= 18:
print("已成年")
输出:
已成年
- 双分支(if-else)
score = 59
if score >= 60:
print("及格")
else:
print("不及格")
输出:
不及格
- 多分支(if-elif-else)
score = 85
if score >= 90:
print("A")
elif score >= 80:
print("B")
elif score >= 60:
print("C")
else:
print("D")
输出:
B
3.1.2 布尔与比较/逻辑运算¶
- 布尔值:
True、False - 比较运算:
==、!=、<、<=、>、>= - 逻辑运算:
and、or、not
x = 3
print(x > 2, x == 5)
n = 7
print(n > 0 and n % 2 == 1)
输出:
True False
True
3.1.3 嵌套条件语句¶
user = "admin"
pwd = "123"
if user == "admin":
if pwd == "123":
print("登录成功")
else:
print("密码错误")
else:
print("用户不存在")
输出:
登录成功
3.1.4 条件表达式(三元运算符)¶
age = 20
status = "成年" if age >= 18 else "未成年"
print(status)
输出:
成年
3.1.5 实际应用:闰年判断¶
规则:闰年满足 (被4整除且不被100整除) 或 被400整除。
year = 2024
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
print("闰年")
else:
print("平年")
输出:
闰年
3.2 循环语句(for、while)¶
3.2.1 基本概念¶
循环用于重复执行代码块,直到条件不满足或显式中断。
3.2.2 while 循环¶
i = 1
while i <= 3:
print(i)
i += 1
输出:
1
2
3
避免无限循环:确保循环条件会变为 False,必要时在循环体内更新变量。
while-else:循环未被 break 打断时执行 else。
i = 1
while i < 3:
print(i)
i += 1
else:
print("循环正常结束")
输出:
1
2
循环正常结束
3.2.3 for 循环与遍历¶
遍历序列(字符串、列表、元组等):
for c in "hi":
print(c)
for item in [1, 2, 3]:
print(item)
输出:
h
i
1
2
3
range() 的使用:
for i in range(3):
print(i)
for i in range(1, 4):
print(i)
for i in range(2, 7, 2):
print(i)
输出(截取要点):
0
1
2
1
2
3
2
4
6
for-else:无 break 时执行 else。
for i in range(3):
print(i)
else:
print("无break,执行else")
输出:
0
1
2
无break,执行else
3.2.4 循环选择策略¶
- 数据量小且次数明确优先用
for;基于条件循环优先用while。 - 需要下标且遍历序列时,配合
enumerate。 - 需要计数可用
range(n),需要区间用range(start, stop[, step])。
3.3 break 和 continue 语句¶
3.3.1 break 的作用与用法¶
立即结束所在层的循环。
在 while 中:
i = 0
while True:
i += 1
if i == 3:
break
print(i)
输出:
3
在 for 中:
for n in [1, 3, 5, 8, 9]:
if n % 2 == 0:
print("找到偶数:", n)
break
输出:
找到偶数: 8
多层循环中的 break(只跳出内层):
for i in range(1, 4):
for j in range(1, 4):
if j == 2:
break
print(i, j)
输出(截取要点):
1 1
2 1
3 1
3.3.2 continue 的作用与用法¶
跳过当前迭代,直接进入下一轮。
for n in range(1, 6):
if n % 2 == 0:
continue
print(n)
输出:
1
3
5
3.3.3 区别与最佳实践¶
break结束循环;continue跳过本次迭代。- 避免与过深的嵌套混用,必要时抽函数或使用标志位/
any/all。 - 查找目标时,优先考虑
any()并结合生成式提高可读性。
3.4 pass 语句¶
3.4.1 概念¶
pass 表示“什么都不做”,常用于占位,保持语法完整。
3.4.2 使用场景¶
- 在函数/类/条件中占位,后续再补充实现。
def todo():
pass
class Empty:
pass
flag = False
if flag:
pass
else:
print("else执行")
输出:
else执行
3.4.3 与其他语句的区别¶
pass不改变流程;break/continue改变循环执行。
3.5 循环嵌套与实践¶
3.5.1 打印图案¶
n = 5
for i in range(1, n + 1):
print("*" * i)
输出(截取要点):
*
**
***
****
*****
3.5.2 二维数据处理与求和¶
matrix = [[1, 2, 3], [4, 5, 6]]
total = 0
for row in matrix:
for num in row:
total += num
print(total)
输出:
21
3.5.3 查找算法(带提前结束)¶
matrix = [[1, 2, 3], [4, 5, 6]]
target = 5
found = False
for row in matrix:
for num in row:
if num == target:
found = True
break
if found:
break
print("找到" if found else "未找到")
输出:
找到
利用内置函数提升可读性:
nums = [1, 3, 5, 8]
print(any(n % 2 == 0 for n in nums))
输出:
True
3.5.4 性能与优化建议¶
- 多重循环通常是 \(O(n^2)\) 或更高,优先考虑提前
break、剪枝条件。 - 善用内置函数(
any、all、sum、max、min)与生成式提升可读性与速度。 - 遍历时如需下标,用
enumerate;需要键值对,用items()。 - 复杂逻辑抽函数,减少嵌套层级。
3.5.5 实际小案例:过滤有效邮箱¶
emails = ["a@b.com", "bad", "c@d.com"]
valid = []
for e in emails:
if "@" not in e:
continue
valid.append(e)
print(valid)
输出:
['a@b.com', 'c@d.com']
通过本章的学习,你应能熟练使用条件判断与循环,在实际项目中写出更清晰、可靠且高效的控制流程代码。