Python 基础篇(六):第六章:条件循环分支


第六章. 条件判断与循环:让程序做决策

在前面的章节中,我们学习了变量、数据类型、运算符和数据容器。但到目前为止,我们的程序都是"一条路走到黑",从第一行执行到最后一行,没有任何分支和重复。

真实的程序需要根据不同情况做出不同反应,也需要重复执行某些操作。这一章,我们将学习条件判断和循环,让程序变得智能。


6.1. 条件判断:if/elif/else

6.1.1. 为什么需要条件判断?

假设你要写一个程序,判断学生的成绩是否及格。如果没有条件判断,你只能这样写:

1
2
score = 85
print("成绩及格")

但这样有个问题:无论成绩是多少,都会输出"成绩及格"。我们需要让程序根据成绩的不同,输出不同的结果。

条件判断可以解决这个问题

1
2
3
4
5
6
score = 85

if score >= 60:
print("成绩及格")
else:
print("成绩不及格")

现在,程序会根据 score 的值,自动选择输出哪一句话。


6.1.2. if 语句的基础用法

if 语句的语法很简单:

1
2
if 条件:
执行的代码

关键点

  1. if 后面跟一个条件表达式,结果必须是 TrueFalse
  2. 条件后面必须有冒号 :
  3. 执行的代码必须缩进(通常是 4 个空格)
1
2
3
4
5
age = 20

if age >= 18:
print("你已经成年了")
print("可以考驾照了")

如果条件为 False,缩进的代码不会执行:

1
2
3
4
5
6
age = 16

if age >= 18:
print("你已经成年了") # 不会执行

print("程序继续运行") # 会执行

6.1.3. if-else:二选一

if-else 用于"二选一"的场景:

1
2
3
4
5
6
score = 55

if score >= 60:
print("及格")
else:
print("不及格")

执行逻辑

  • 如果条件为 True,执行 if 下的代码
  • 如果条件为 False,执行 else 下的代码

6.1.4. if-elif-else:多选一

当有多个条件需要判断时,使用 if-elif-else

1
2
3
4
5
6
7
8
9
10
score = 85

if score >= 90:
print("优秀")
elif score >= 80:
print("良好")
elif score >= 60:
print("及格")
else:
print("不及格")

执行逻辑

  • 从上到下依次判断条件
  • 一旦某个条件为 True,执行对应的代码,然后跳出整个 if 语句
  • 如果所有条件都为 False,执行 else 下的代码

6.1.5. 嵌套的 if 语句

if 语句可以嵌套:

1
2
3
4
5
6
7
8
9
10
age = 20
has_id = True

if age >= 18:
if has_id:
print("可以进入网吧")
else:
print("请出示身份证")
else:
print("未成年人禁止入内")

但嵌套太多会让代码难以阅读,可以用逻辑运算符简化:

1
2
3
4
5
6
7
8
9
age = 20
has_id = True

if age >= 18 and has_id:
print("可以进入网吧")
elif age >= 18 and not has_id:
print("请出示身份证")
else:
print("未成年人禁止入内")

6.1.6. 链式比较:Python 的优雅写法

Python 支持数学风格的链式比较:

1
2
3
4
5
6
7
8
9
score = 85

# 传统写法
if score >= 60 and score < 90:
print("成绩良好")

# 链式比较(推荐)
if 60 <= score < 90:
print("成绩良好")

链式比较更简洁、更符合数学习惯。


6.1.7. 条件判断的常见错误与避坑指南

错误 1:忘记冒号

1
2
3
4
5
6
7
# ❌ 错误
if score >= 60
print("及格")

# ✅ 正确
if score >= 60:
print("及格")

错误 2:缩进错误

1
2
3
4
5
6
7
8
9
# ❌ 错误:缩进不一致
if score >= 60:
print("及格")
print("恭喜") # 缩进多了

# ✅ 正确
if score >= 60:
print("及格")
print("恭喜")

错误 3:使用赋值运算符 = 而不是比较运算符 ==

1
2
3
4
5
6
7
# ❌ 错误
if score = 60: # SyntaxError
print("及格")

# ✅ 正确
if score == 60:
print("及格")

6.2. 用户输入:input() 函数

6.2.1. 为什么需要用户输入?

到目前为止,我们的程序中的数据都是"写死"的。如果要改变数据,必须修改代码。这显然不现实。

input() 函数可以让程序在运行时接收用户输入的数据。


6.2.2. input() 的基础用法

1
2
name = input("请输入你的姓名:")
print(f"你好,{name}!")

执行流程

  1. 程序显示提示信息"请输入你的姓名:"
  2. 等待用户输入
  3. 用户按回车后,输入的内容被赋值给 name

6.2.3. input() 返回的是字符串

重要input() 返回的永远是字符串,即使用户输入的是数字。

1
2
age = input("请输入你的年龄:")
print(type(age)) # <class 'str'>

如果要进行数值运算,必须先转换类型:

1
2
3
4
5
age = input("请输入你的年龄:")
age = int(age) # 转换为整数

if age >= 18:
print("你已经成年了")

6.2.4. 类型转换与输入验证

1
2
3
4
5
# 转换为整数
age = int(input("请输入你的年龄:"))

# 转换为浮点数
price = float(input("请输入价格:"))

常见错误:用户输入非数字时,程序会崩溃:

1
2
age = int(input("请输入你的年龄:"))
# 如果用户输入 "abc",会报错:ValueError: invalid literal for int()

我们会在后续章节学习如何处理这种错误(异常处理)。


6.3. for 循环:遍历容器

6.3.1. 为什么需要循环?

假设你要打印列表中的所有元素:

1
2
3
4
5
6
7
scores = [90, 85, 92, 88, 95]

print(scores[0])
print(scores[1])
print(scores[2])
print(scores[3])
print(scores[4])

如果列表有 100 个元素呢?显然不能这样写。循环可以解决这个问题


6.3.2. for 循环的基础用法

1
2
3
4
scores = [90, 85, 92, 88, 95]

for score in scores:
print(score)

执行流程

  1. scores 中取出第一个元素 90,赋值给 score
  2. 执行循环体中的代码
  3. 取出第二个元素 85,赋值给 score
  4. 重复,直到所有元素都处理完

6.3.3. range() 函数:生成数字序列

range() 可以生成一个数字序列:

1
2
3
4
5
6
7
8
9
10
11
# 打印 0 到 4
for i in range(5):
print(i) # 0, 1, 2, 3, 4

# 打印 1 到 5
for i in range(1, 6):
print(i) # 1, 2, 3, 4, 5

# 打印 0 到 10,步长为 2
for i in range(0, 11, 2):
print(i) # 0, 2, 4, 6, 8, 10

6.3.4. 遍历列表、元组、字典、集合

1
2
3
4
5
6
7
8
9
10
11
12
13
# 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)

# 遍历字典的键
student = {"name": "张三", "age": 25}
for key in student:
print(key, student[key])

# 遍历字典的键值对
for key, value in student.items():
print(key, value)

6.3.5. enumerate():同时获取索引和值

1
2
3
4
5
6
7
8
fruits = ["apple", "banana", "cherry"]

for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
# 输出:
# 0: apple
# 1: banana
# 2: cherry

6.3.6. zip():并行遍历多个容器

1
2
3
4
5
names = ["张三", "李四", "王五"]
ages = [25, 30, 28]

for name, age in zip(names, ages):
print(f"{name} 今年 {age} 岁")

6.4. while 循环:条件循环

6.4.1. for vs while:何时用哪个?

  • for 循环:知道循环次数或需要遍历容器
  • while 循环:不知道循环次数,只知道退出条件

6.4.2. while 循环的基础用法

1
2
3
4
5
count = 0

while count < 5:
print(count)
count += 1

6.4.3. while True:常见的循环模式

1
2
3
4
5
while True:
user_input = input("请输入 'q' 退出:")
if user_input == "q":
break
print(f"你输入了:{user_input}")

6.5. break 和 continue:控制循环流程

6.5.1. break:提前退出循环

1
2
3
4
for i in range(10):
if i == 5:
break
print(i) # 输出 0, 1, 2, 3, 4

6.5.2. continue:跳过本次循环

1
2
3
4
for i in range(5):
if i == 2:
continue
print(i) # 输出 0, 1, 3, 4

6.6. 模式匹配:match/case(Python 3.10+)

6.6.1. 为什么需要模式匹配?

当有多个条件需要判断时,if-elif-else 会变得冗长:

1
2
3
4
5
6
7
8
9
10
status = "success"

if status == "success":
print("操作成功")
elif status == "error":
print("操作失败")
elif status == "pending":
print("等待中")
else:
print("未知状态")

match-case 可以让代码更简洁:

1
2
3
4
5
6
7
8
9
10
11
status = "success"

match status:
case "success":
print("操作成功")
case "error":
print("操作失败")
case "pending":
print("等待中")
case _:
print("未知状态")

6.6.2. 匹配多个值

1
2
3
4
5
6
7
8
9
day = "Saturday"

match day:
case "Saturday" | "Sunday":
print("周末")
case "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday":
print("工作日")
case _:
print("无效的日期")

6.6.3. 守卫条件:if 子句

1
2
3
4
5
6
7
8
9
score = 85

match score:
case s if s >= 90:
print("优秀")
case s if s >= 60:
print("及格")
case _:
print("不及格")

6.7. 综合实战:猜数字游戏

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import random

# 生成 1-100 的随机数
secret = random.randint(1, 100)
attempts = 0

print("欢迎来到猜数字游戏!")
print("我想了一个 1-100 之间的数字,你能猜到吗?")

while True:
guess = int(input("请输入你的猜测:"))
attempts += 1

if guess < secret:
print("太小了!")
elif guess > secret:
print("太大了!")
else:
print(f"恭喜你猜对了!你用了 {attempts} 次")
break

6.8. 本章小结

本章学习了条件判断和循环,让程序能够根据不同情况做出不同反应。

知识点使用场景关键语法
if/elif/else条件判断if 条件:
for 循环遍历容器for item in container:
while 循环条件循环while 条件:
break提前退出循环break
continue跳过本次循环continue
match/case模式匹配match 变量: