第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 布尔与比较/逻辑运算

  • 布尔值:TrueFalse
  • 比较运算:==!=<<=>>=
  • 逻辑运算:andornot
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、剪枝条件。
  • 善用内置函数(anyallsummaxmin)与生成式提升可读性与速度。
  • 遍历时如需下标,用 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']

通过本章的学习,你应能熟练使用条件判断与循环,在实际项目中写出更清晰、可靠且高效的控制流程代码。

小夜