流程控制
学习目标
- 掌握
if/elif/else条件判断 - 掌握
for循环和while循环 - 学会使用
break、continue控制循环 - 能编写包含嵌套逻辑的程序
什么是流程控制?
到目前为止,你写的代码都是从上到下一行一行执行的。但真实的程序需要做判断、需要重复执行——这就是流程控制。
想象你早上出门的决策过程:
如果 下雨了:
带伞
否则如果 太阳很大:
戴帽子
否则:
直接出门
这就是条件判断。
再想象你背单词:
重复 100 次:
看一个新单词
记住它
这就是循环。
条件判断:if / elif / else
基本的 if
temperature = 35
if temperature > 30:
print("今天很热,注意防暑!")
语法规则:
if后面跟条件表达式- 条件后面有一个冒号
:(很多新手会忘记) - 条件成立时执行的代码需要缩进 4 个空格
if...else
age = 15
if age >= 18:
print("你已经成年了")
print("可以看这部电影")
else:
print("你还未成年")
print("需要家长陪同")
if...elif...else
elif 是 "else if" 的缩写,用来检查多个条件:
score = 85
if score >= 90:
grade = "A(优秀)"
elif score >= 80:
grade = "B(良好)"
elif score >= 70:
grade = "C(中等)"
elif score >= 60:
grade = "D(及格)"
else:
grade = "F(不及格)"
print(f"你的成绩: {score} 分,等级: {grade}")
# 输 出: 你的成绩: 85 分,等级: B(良好)
Python 从上到下依次检查每个条件,一旦某个条件成立,就执行对应的代码块,然后跳过剩余所有的 elif 和 else。所以条件的顺序很重要!
score = 95
# 错误的顺序 ❌
if score >= 60:
print("及格") # 95 >= 60 成立,直接执行这个
elif score >= 90:
print("优秀") # 不会被执行!
# 正确的顺序 ✅:从严到宽
if score >= 90:
print("优秀") # 95 >= 90 成立,执行这个
elif score >= 60:
print("及格")
条件判断的简写
# 三元表达式(一行搞定简单的 if-else)
age = 20
status = "成年" if age >= 18 else "未成年"
print(status) # 成年
# 等价于
if age >= 18:
status = "成年"
else:
status = "未成年"
嵌套的 if
条件里面可以再套条件:
has_ticket = True
age = 15
if has_ticket:
if age >= 18:
print("请入场")
else:
print("未成年人需要家长陪同")
else:
print("请先购票")
不过嵌套太多层会让代码难以阅读,通常不建议超过 3 层。
for 循环
for 循环用来遍历一个序列(列表、字符串、范围等)中的每个元素。
遍历列表
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
for fruit in fruits:
print(f"我喜欢吃{fruit}")
# 输出:
# 我喜欢吃苹果
# 我喜欢吃香蕉
# 我喜欢吃橙子
# 我喜欢吃葡萄
理解方式:for fruit in fruits 的意思是"对于 fruits 中的每一个 fruit,执行下面的代码"。
遍历字符串
word = "Python"
for char in word:
print(char, end=" ")
# 输出: P y t h o n
range() 函数
range() 生成一个数字序列,是 for 循环最常用的搭档:
# range(5) 生成 0, 1, 2, 3, 4
for i in range(5):
print(i, end=" ")
# 输出: 0 1 2 3 4
# range(start, stop) 从 start 到 stop-1
for i in range(1, 6):
print(i, end=" ")
# 输出: 1 2 3 4 5
# range(start, stop, step) 带步长
for i in range(0, 10, 2):
print(i, end=" ")
# 输出: 0 2 4 6 8
# 倒数
for i in range(5, 0, -1):
print(i, end=" ")
# 输出: 5 4 3 2 1
实际案例:计算 1 到 100 的和
total = 0
for i in range(1, 101):
total += i
print(f"1 到 100 的和是: {total}") # 5050
enumerate():同时获取索引和值
students = ["张三", "李四", "王五"]
# 普通写法
for i in range(len(students)):
print(f"第 {i+1} 名: {students[i]}")
# 更 Pythonic 的写法:用 enumerate
for i, name in enumerate(students):
print(f"第 {i+1} 名: {name}")
# 指定起始编号
for i, name in enumerate(students, start=1):
print(f"第 {i} 名: {name}")
while 循环
while 循环在条件成立时持续执行,直到条件不成立为止。
基本用法
count = 0
while count < 5:
print(f"当前计数: {count}")
count += 1 # 别忘了更新条件!
print("循环结束")
# 输出:
# 当前计数: 0
# 当前计数: 1
# 当前计数: 2
# 当前计数: 3
# 当前计数: 4
# 循环结束
如果忘了更新条件变量,循环永远不会停止:
# 死循环示例(不要运行!)
count = 0
while count < 5:
print(count)
# 忘了 count += 1,count 永远是 0,循环永不结束
如果不小心陷入死循环,按 Ctrl+C 强制终止程序。
while 的典型场景
while 适合不确定循环次数的情况:
# 场景:猜数字游戏
import random
target = random.randint(1, 100)
guess = 0
attempts = 0
print("我想了一个 1 到 100 的数字,猜猜看!")
while guess != target:
guess = int(input("你的猜测: "))
attempts += 1
if guess < target:
print("太小了!")
elif guess > target:
print("太大了!")
else:
print(f"恭喜你猜对了!用了 {attempts} 次")
for vs while 怎么选?
| 场景 | 推荐 | 原因 |
|---|---|---|
| 遍历列表/字符串 | for | 天然适合 |
| 循环固定次数 | for + range() | 简洁明确 |
| 不确定循环次数 | while | 灵活控制 |
| 等待某个条件成立 | while | 自然直觉 |
经验法则:能用 for 就用 for,它更安全(不会死循环)。
break 和 continue
break:立即终止循环
# 找到第一个偶数就停下
numbers = [1, 3, 7, 4, 9, 2]
for num in numbers:
if num % 2 == 0:
print(f"找到第一个偶数: {num}")
break
print(f"{num} 不是偶数,继续找...")
# 输出:
# 1 不是偶数,继续找...
# 3 不是偶数,继续找...
# 7 不是偶数,继续找...
# 找到第一个偶数: 4
continue:跳过本次循环,继续下一次
# 打印所有奇数,跳过偶数
for i in range(1, 11):
if i % 2 == 0:
continue # 跳过偶数
print(i, end=" ")
# 输出: 1 3 5 7 9
break 和 continue 的区别
# break:直接离开循环
for i in range(10):
if i == 5:
break # 循环到 5 就整个停了
print(i, end=" ")
# 输出: 0 1 2 3 4
# continue:跳过当前,继续下一个
for i in range(10):
if i == 5:
continue # 跳过 5,继续 6, 7, 8, 9
print(i, end=" ")
# 输出: 0 1 2 3 4 6 7 8 9
循环中的 else
Python 的循环有一个独特的 else 子句——当循环正常结束(不是被 break 终止)时执行:
# 检查一个数是否是质数
num = 17
for i in range(2, num):
if num % i == 0:
print(f"{num} 不是质数,可以被 {i} 整除")
break
else:
# 循环没有被 break 终止,说明没有找到因子
print(f"{num} 是质数")
# 输出: 17 是质数
嵌套循环
循环里面可以再套循环:
# 打印九九乘法表
for i in range(1, 10):
for j in range(1, i + 1):
print(f"{j}×{i}={i*j}", end="\t")
print() # 每行结束后换行
输出:
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
...
1×9=9 2×9=18 3×9=27 ... 9×9=81
综合案例
案例 1:模拟 AI 模型训练过程
import random
print("=== 开始训练模型 ===")
print(f"{'Epoch':<10}{'Loss':<15}{'Accuracy':<15}{'Status'}")
print("-" * 50)
loss = 2.5
accuracy = 0.10
for epoch in range(1, 21):
# 模拟训练:损失逐渐下降,准确率逐渐上升
loss *= random.uniform(0.85, 0.95)
accuracy = min(accuracy + random.uniform(0.03, 0.06), 1.0)
# 判断训练状态
if accuracy >= 0.95:
status = "✅ 达标"
elif accuracy >= 0.80:
status = "📈 良好"
else:
status = "🔄 训练中"
print(f"{epoch:<10}{loss:<15.4f}{accuracy:<15.2%}{status}")
# 如果准确率达到 98%,提前停止
if accuracy >= 0.98:
print(f"\n提前停止!在第 {epoch} 轮达到目标准确率")
break
else:
print(f"\n训练完成!最终准确率: {accuracy:.2%}")
案例 2:密码强度检查器
password = input("请输入密码: ")
has_upper = False # 是否有大写字母
has_lower = False # 是否有小写字母
has_digit = False # 是否有数字
has_special = False # 是否有特殊字符
for char in password:
if char.isupper():
has_upper = True
elif char.islower():
has_lower = True
elif char.isdigit():
has_digit = True
else:
has_special = True
# 计算强度分数
score = 0
if len(password) >= 8:
score += 1
if has_upper:
score += 1
if has_lower:
score += 1
if has_digit:
score += 1
if has_special:
score += 1
# 输出结果
print(f"\n密码强度: {'★' * score}{'☆' * (5 - score)} ({score}/5)")
if score <= 2:
print("弱密码!建议加强")
elif score <= 4:
print("中等强度")
else:
print("强密码!")
动手练习
练习 1:FizzBuzz
这是经典的编程面试题:
打印 1 到 50 的数字,但是:
- 如果数字能被 3 整除,打印 "Fizz"
- 如果数字能被 5 整除,打印 "Buzz"
- 如果数字同时能被 3 和 5 整除,打印 "FizzBuzz"
- 其他情况打印数字本身
for i in range(1, 51):
# 补充代码
pass
提示:先判断能否被 15 整除(3 和 5 的公倍数),再判断 3 和 5。
练习 2:猜数字游戏(限制次数)
改进猜数字游戏:最多允许猜 7 次,超过就失败。
import random
target = random.randint(1, 100)
max_attempts = 7
# 补充代码
练习 3:画三角形
用循环打印以下图案:
*
**
***
****
*****
然后试着打印倒三角形:
*****
****
***
**
*
练习 4:求质数
打印 1 到 100 之间的所有质数。
提示:质数是大于 1 的自然数,且只能被 1 和自身整除。
小结
| 语法 | 用途 | 关键点 |
|---|---|---|
if/elif/else | 条件判断 | 条件从上到下检查,冒号和缩进不能忘 |
for...in | 遍历序列 | 配合 range()、列表、字符串使用 |
while | 条件循环 | 注意更新条件,避免死循环 |
break | 终止循环 | 立即跳出整个循环 |
continue | 跳过本次 | 跳过当前迭代,继续下一次 |
range() | 生成数字序列 | range(start, stop, step) |
流程控制是编程的骨架。变量是数据,运算符是操作,而流程控制决定了"在什么条件下做什么"和"做多少次"。学会了流程控制,你就能写出有"逻辑"的程序了。