前言:程序流程控制的重要性

在前四篇文章中,我们学习了Python的基本语法、变量与数据类型以及运算符。现在,我们将进入编程中最为关键的部分——程序流程控制。条件语句和循环语句是编程语言的"决策大脑"和"重复引擎",它们赋予了程序根据不同情况做出判断和重复执行任务的能力。

无论是简单的脚本还是复杂的应用程序,几乎所有的程序都依赖于条件判断循环结构。掌握这些控制结构,意味着你能够编写出真正"智能"的程序,而不仅仅是简单的顺序执行代码。

本文将深入探讨Python中的条件语句(if/elif/else循环语句(for/while,通过丰富的实战案例,帮助你理解它们的原理、应用场景以及最佳实践。


一、 条件语句:程序的决策能力

条件语句允许程序根据不同的条件执行不同的代码块,这是程序具有"智能"行为的基础。

1.1 基本的if语句

语法结构:

if condition:
    # 如果条件为True,执行这里的代码
    statement1
    statement2
    ...

实战案例5-1:基本的if语句

# 判断一个数是否为正数
number = float(input("请输入一个数字: "))

if number > 0:
    print("这是一个正数")
    print("谢谢您的输入!")

# 判断用户是否成年
age = int(input("请输入您的年龄: "))

if age >= 18:
    print("您已成年,可以访问所有内容")

1.2 if-else语句

语法结构:

if condition:
    # 如果条件为True,执行这里的代码
    true_block
else:
    # 如果条件为False,执行这里的代码
    false_block

实战案例5-2:if-else语句应用

# 判断数字的奇偶性
number = int(input("请输入一个整数: "))

if number % 2 == 0:
    print(f"{number} 是偶数")
else:
    print(f"{number} 是奇数")

# 简单的登录验证
username = input("请输入用户名: ")
password = input("请输入密码: ")

if username == "admin" and password == "123456":
    print("登录成功!")
else:
    print("用户名或密码错误")

1.3 if-elif-else语句

语法结构:

if condition1:
    # 如果condition1为True,执行这里的代码
    block1
elif condition2:
    # 如果condition1为False但condition2为True,执行这里的代码
    block2
elif condition3:
    # 如果上述条件都为False但condition3为True,执行这里的代码
    block3
else:
    # 如果所有条件都为False,执行这里的代码
    else_block

实战案例5-3:多条件判断

# 成绩等级判断
score = float(input("请输入您的成绩(0-100): "))

if score >= 90:
    grade = "A"
    print("优秀!")
elif score >= 80:
    grade = "B"
    print("良好")
elif score >= 70:
    grade = "C"
    print("中等")
elif score >= 60:
    grade = "D"
    print("及格")
else:
    grade = "F"
    print("不及格")

print(f"您的成绩等级是: {grade}")

# 根据温度给出穿衣建议
temperature = float(input("请输入当前温度(摄氏度): "))

if temperature > 30:
    print("天气炎热,建议穿短袖、短裤,注意防晒")
elif temperature > 20:
    print("天气温暖,建议穿长袖或薄外套")
elif temperature > 10:
    print("天气凉爽,建议穿外套或毛衣")
else:
    print("天气寒冷,建议穿厚外套、毛衣,注意保暖")

1.4 嵌套条件语句

实战案例5-4:嵌套条件判断

# 权限管理系统
is_logged_in = True
user_role = "admin"  # 可能是 "user", "admin", "guest"
is_premium = False

if is_logged_in:
    if user_role == "admin":
        print("欢迎管理员,您有所有权限")
    elif user_role == "user":
        if is_premium:
            print("欢迎尊贵的会员用户")
        else:
            print("欢迎普通用户,考虑升级到会员吗?")
    else:
        print("欢迎访客用户,权限有限")
else:
    print("请先登录")

# 闰年判断
year = int(input("请输入年份: "))

if year % 4 == 0:
    if year % 100 == 0:
        if year % 400 == 0:
            print(f"{year}年是闰年")
        else:
            print(f"{year}年不是闰年")
    else:
        print(f"{year}年是闰年")
else:
    print(f"{year}年不是闰年")

1.5 条件表达式(三元运算符)

Python提供了简洁的三元运算符语法,用于简单的条件赋值。

语法结构:

value = true_value if condition else false_value

实战案例5-5:三元运算符应用

# 传统的if-else方式
age = 20
if age >= 18:
    status = "成年人"
else:
    status = "未成年人"

# 使用三元运算符
status = "成年人" if age >= 18 else "未成年人"
print(f"状态: {status}")

# 更多示例
# 找出两个数中的较大值
a, b = 10, 20
max_value = a if a > b else b
print(f"{a}{b}中的较大值是: {max_value}")

# 判断数字符号
number = -5
sign = "正数" if number > 0 else ("零" if number == 0 else "负数")
print(f"{number}是一个{sign}")

# 在实际代码中的应用
scores = [85, 92, 78, 90, 65]
passing_scores = [score for score in scores if score >= 60]
print(f"及格分数: {passing_scores}")

二、 循环语句:程序的重复引擎

循环语句允许程序重复执行一段代码,这是处理重复性任务的基础。

2.1 for循环

for循环用于遍历序列(如列表、元组、字符串)或其他可迭代对象。

语法结构:

for element in iterable:
    # 对每个元素执行的代码
    statement1
    statement2
    ...

实战案例5-6:for循环基础

# 遍历列表
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
for fruit in fruits:
    print(f"我喜欢吃{fruit}")

# 遍历字符串
message = "Hello Python"
for char in message:
    print(char, end="-")
print()  # 换行

# 使用range()函数
print("0到4的数字:")
for i in range(5):  # 0, 1, 2, 3, 4
    print(i, end=" ")
print()

print("2到8的偶数:")
for i in range(2, 9, 2):  # 2, 4, 6, 8
    print(i, end=" ")
print()

# 计算1到100的和
total = 0
for number in range(1, 101):
    total += number
print(f"1到100的和是: {total}")

2.2 while循环

while循环在条件为真时重复执行代码块。

语法结构:

while condition:
    # 只要条件为True就重复执行
    statement1
    statement2
    ...

实战案例5-7:while循环应用

# 简单的计数器
count = 5
while count > 0:
    print(f"倒计时: {count}")
    count -= 1
print("发射!")

# 用户输入验证
password = ""
while password != "secret":
    password = input("请输入密码: ")
    if password != "secret":
        print("密码错误,请重试")
print("密码正确,欢迎访问!")

# 模拟游戏循环
game_running = True
player_health = 100
while game_running:
    print(f"玩家健康值: {player_health}")
    action = input("请输入动作(attack/heal/quit): ")
    
    if action == "attack":
        player_health -= 10
        print("受到攻击,健康值-10")
    elif action == "heal":
        player_health += 15
        print("恢复健康,健康值+15")
    elif action == "quit":
        game_running = False
        print("游戏结束")
    else:
        print("无效动作")
    
    if player_health <= 0:
        print("游戏结束,玩家死亡")
        game_running = False

2.3 循环控制语句

Python提供了break、continue和pass语句来控制循环的执行。

实战案例5-8:循环控制语句

# break语句:立即退出循环
print("寻找第一个能被3和5整除的数:")
for i in range(1, 100):
    if i % 3 == 0 and i % 5 == 0:
        print(f"找到了: {i}")
        break  # 找到后立即退出循环

# continue语句:跳过当前迭代,继续下一轮
print("1到10中的奇数:")
for i in range(1, 11):
    if i % 2 == 0:
        continue  # 跳过偶数
    print(i, end=" ")
print()

# pass语句:占位符,什么都不做
for i in range(5):
    if i == 2:
        pass  # 什么也不做,只是占位
    else:
        print(i, end=" ")
print()

# 循环的else子句:循环正常结束(非break退出)时执行
print("寻找质数:")
for num in range(2, 10):
    for i in range(2, num):
        if num % i == 0:
            print(f"{num} = {i} * {num//i}")
            break
    else:
        # 循环正常结束(没有找到因子),说明是质数
        print(f"{num} 是质数")

2.4 嵌套循环

实战案例5-9:嵌套循环应用

# 打印乘法表
print("乘法表:")
for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{j}×{i}={i*j}", end="\t")
    print()  # 换行

# 查找二维列表中的元素
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

target = 5
found = False
for row in matrix:
    for element in row:
        if element == target:
            print(f"找到目标值 {target}")
            found = True
            break  # 只退出内层循环
    if found:
        break  # 退出外层循环

# 使用标志变量控制嵌套循环退出
print("坐标对:")
for x in range(3):
    for y in range(3):
        print(f"({x}, {y})", end=" ")
        if x == 1 and y == 1:
            print("\n找到中心点,停止搜索")
            break
    else:
        continue  # 仅当内层循环正常结束时执行
    break  # 内层循环break后执行

三、 迭代工具与技巧

Python提供了许多强大的迭代工具和技巧,可以使循环更加简洁和高效。

3.1 enumerate()函数

实战案例5-10:使用enumerate()获取索引

# 传统方式:使用range(len())
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
for i in range(len(fruits)):
    print(f"{i+1}. {fruits[i]}")

# 更好的方式:使用enumerate()
for index, fruit in enumerate(fruits, start=1):
    print(f"{index}. {fruit}")

# 在循环中修改列表元素
numbers = [1, 2, 3, 4, 5]
for i, num in enumerate(numbers):
    numbers[i] = num * 2
print(f"加倍后的列表: {numbers}")

3.2 zip()函数

实战案例5-11:使用zip()并行迭代

# 并行迭代多个序列
names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]

for name, score in zip(names, scores):
    print(f"{name}的成绩是{score}")

# 处理不同长度的序列
list1 = [1, 2, 3, 4, 5]
list2 = ['a', 'b', 'c']
for item1, item2 in zip(list1, list2):
    print(f"{item1} - {item2}")

# 与enumerate()结合使用
for i, (name, score) in enumerate(zip(names, scores), start=1):
    print(f"{i}. {name}: {score}")

3.3 列表推导式

列表推导式提供了一种简洁的方式来创建列表。

实战案例5-12:列表推导式应用

# 传统方式:使用for循环
squares = []
for x in range(10):
    squares.append(x**2)
print(f"平方数: {squares}")

# 使用列表推导式
squares = [x**2 for x in range(10)]
print(f"平方数: {squares}")

# 带条件的列表推导式
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(f"偶数的平方: {even_squares}")

# 嵌套循环的列表推导式
pairs = [(x, y) for x in range(3) for y in range(3)]
print(f"坐标对: {pairs}")

# 实际应用:处理字符串列表
words = ["Hello", "World", "Python", "Programming"]
lengths = [len(word) for word in words]
print(f"单词长度: {lengths}")

# 转换大小写
uppercase_words = [word.upper() for word in words]
print(f"大写单词: {uppercase_words}")

四、 综合实战:学生成绩管理系统

现在,让我们创建一个综合性的学生成绩管理系统,应用本章所学的所有知识。

项目目标:

  • 添加学生和成绩
  • 查看所有学生成绩
  • 计算平均分和统计等级分布
  • 查找特定学生成绩
  • 提供交互式菜单界面

代码实现:

def student_grade_system():
    """学生成绩管理系统"""
    students = {}  # 字典存储学生信息:{学号: {"name": 姓名, "score": 成绩}}
    
    while True:
        print("\n=== 学生成绩管理系统 ===")
        print("1. 添加学生成绩")
        print("2. 查看所有学生成绩")
        print("3. 计算统计信息")
        print("4. 查找学生成绩")
        print("5. 退出系统")
        
        choice = input("请选择操作(1-5): ")
        
        if choice == "1":
            add_student(students)
        elif choice == "2":
            view_all_students(students)
        elif choice == "3":
            show_statistics(students)
        elif choice == "4":
            search_student(students)
        elif choice == "5":
            print("感谢使用学生成绩管理系统,再见!")
            break
        else:
            print("无效选择,请重新输入")

def add_student(students):
    """添加学生成绩"""
    student_id = input("请输入学号: ")
    
    # 检查学号是否已存在
    if student_id in students:
        print("该学号已存在,无法重复添加")
        return
    
    name = input("请输入姓名: ")
    
    # 验证成绩输入
    while True:
        try:
            score = float(input("请输入成绩(0-100): "))
            if 0 <= score <= 100:
                break
            else:
                print("成绩必须在0-100之间,请重新输入")
        except ValueError:
            print("请输入有效的数字")
    
    # 添加学生信息
    students[student_id] = {"name": name, "score": score}
    print(f"成功添加学生: {name},成绩: {score}")

def view_all_students(students):
    """查看所有学生成绩"""
    if not students:
        print("暂无学生数据")
        return
    
    print("\n学号\t姓名\t成绩\t等级")
    print("-" * 30)
    
    for student_id, info in students.items():
        score = info["score"]
        # 确定等级
        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"{student_id}\t{info['name']}\t{score}\t{grade}")

def show_statistics(students):
    """显示统计信息"""
    if not students:
        print("暂无学生数据")
        return
    
    # 计算平均分
    total_score = sum(info["score"] for info in students.values())
    average = total_score / len(students)
    print(f"平均分: {average:.2f}")
    
    # 统计各等级人数
    grade_count = {"A": 0, "B": 0, "C": 0, "D": 0, "F": 0}
    
    for info in students.values():
        score = info["score"]
        if score >= 90:
            grade_count["A"] += 1
        elif score >= 80:
            grade_count["B"] += 1
        elif score >= 70:
            grade_count["C"] += 1
        elif score >= 60:
            grade_count["D"] += 1
        else:
            grade_count["F"] += 1
    
    print("\n等级分布:")
    for grade, count in grade_count.items():
        print(f"{grade}级: {count}人")
    
    # 找出最高分和最低分
    max_score = max(info["score"] for info in students.values())
    min_score = min(info["score"] for info in students.values())
    
    print(f"最高分: {max_score}")
    print(f"最低分: {min_score}")

def search_student(students):
    """查找学生成绩"""
    if not students:
        print("暂无学生数据")
        return
    
    search_type = input("按学号查找(1) 按姓名查找(2): ")
    
    if search_type == "1":
        student_id = input("请输入学号: ")
        if student_id in students:
            info = students[student_id]
            print(f"找到学生: {info['name']},成绩: {info['score']}")
        else:
            print("未找到该学号的学生")
    
    elif search_type == "2":
        name = input("请输入姓名: ")
        found = False
        
        for student_id, info in students.items():
            if info["name"] == name:
                print(f"找到学生: 学号{student_id},成绩: {info['score']}")
                found = True
        
        if not found:
            print("未找到该姓名的学生")
    
    else:
        print("无效选择")

# 运行系统
if __name__ == "__main__":
    student_grade_system()

运行示例:

=== 学生成绩管理系统 ===
1. 添加学生成绩
2. 查看所有学生成绩
3. 计算统计信息
4. 查找学生成绩
5. 退出系统
请选择操作(1-5): 1
请输入学号: 1001
请输入姓名: 张三
请输入成绩(0-100): 85
成功添加学生: 张三,成绩: 85.0

=== 学生成绩管理系统 ===
1. 添加学生成绩
2. 查看所有学生成绩
3. 计算统计信息
4. 查找学生成绩
5. 退出系统
请选择操作(1-5): 1
请输入学号: 1002
请输入姓名: 李四
请输入成绩(0-100): 92
成功添加学生: 李四,成绩: 92.0

=== 学生成绩管理系统 ===
1. 添加学生成绩
2. 查看所有学生成绩
3. 计算统计信息
4. 查找学生成绩
5. 退出系统
请选择操作(1-5): 2

学号    姓名    成绩    等级
------------------------------
1001    张三    85.0    B
1002    李四    92.0    A

=== 学生成绩管理系统 ===
1. 添加学生成绩
2. 查看所有学生成绩
3. 计算统计信息
4. 查找学生成绩
5. 退出系统
请选择操作(1-5): 3
平均分: 88.50

等级分布:
A级: 1人
B级: 1人
C级: 0人
D级: 0人
F级: 0人
最高分: 92.0
最低分: 85.0

=== 学生成绩管理系统 ===
1. 添加学生成绩
2. 查看所有学生成绩
3. 计算统计信息
4. 查找学生成绩
5. 退出系统
请选择操作(1-5): 5
感谢使用学生成绩管理系统,再见!

总结与展望

通过本篇文章的深入学习,我们全面掌握了Python中的条件语句和循环语句:

  1. 条件语句

    • 掌握了if、if-else和if-elif-else结构的使用
    • 学会了嵌套条件语句的编写
    • 了解了三元运算符的简洁语法
  2. 循环语句

    • 掌握了for循环遍历各种可迭代对象
    • 学会了while循环的条件控制
    • 理解了break、continue和pass的区别和用途
  3. 迭代工具

    • 学会了使用enumerate()获取索引和值
    • 掌握了使用zip()并行迭代多个序列
    • 了解了列表推导式的简洁语法
  4. 综合应用

    • 通过学生成绩管理系统项目,将所学知识融会贯通
    • 学会了如何设计交互式菜单系统
    • 掌握了数据统计和查询功能的实现

这些控制结构是编程的基础,几乎所有的程序都会用到它们。掌握好条件判断和循环,意味着你能够编写出真正具有"智能"行为的程序。

思考题:

  1. 在什么情况下应该使用for循环而不是while循环?反之呢?
  2. 如何避免嵌套循环导致的性能问题?有哪些优化策略?
  3. 列表推导式虽然简洁,但在什么情况下不应该使用它?
  4. 如何设计一个更加健壮的用户输入验证系统,避免程序因无效输入而崩溃?
  5. 在学生成绩管理系统的基础上,还可以添加哪些功能来增强其实用性?

更多推荐