🐍 第03课:流程控制

—— 让程序学会做决策

🏆 if/for/while/comprehension
✅ Python验证通过

📌 本课目标

1️⃣ 条件判断 if/elif/else

# 基本条件
score = 85

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

print(f"成绩: {grade}")  # 成绩: 良好

# 三元表达式
status = "成年" if age >= 18 else "未成年"

# 海象运算符 := (Python 3.8+)
# 在条件中赋值,避免重复计算
import re
if (match := re.search(r'\d+', "abc123def")):
    print(f"找到数字: {match.group()}")  # 找到数字: 123

# 多条件判断
name = "admin"
if name in ["admin", "root", "superuser"]:
    print("管理员账户")

2️⃣ match-case 模式匹配(Python 3.10+)

def handle_command(cmd):
    match cmd.split():
        case ["quit"]:
            return "退出程序"
        case ["goto", dest]:
            return f"前往 {dest}"
        case ["move", direction, distance]:
            return f"向{direction}移动{distance}步"
        case ["help", *topics]:
            return f"帮助主题: {topics}"
        case _:
            return "未知命令"

print(handle_command("goto 北京"))        # 前往 北京
print(handle_command("move 东 10"))       # 向东移动10步
print(handle_command("help a b c"))      # 帮助主题: ['a', 'b', 'c']

3️⃣ for 循环

# 基本遍历
fruits = ["苹果", "香蕉", "橙子"]
for fruit in fruits:
    print(fruit)

# enumerate 获取索引
for i, fruit in enumerate(fruits):
    print(f"{i}: {fruit}")

# enumerate 从指定序号开始
for i, fruit in enumerate(fruits, start=1):
    print(f"第{i}个: {fruit}")

# range 三种用法
for i in range(5):        # 0,1,2,3,4
    print(i, end=" ")
for i in range(2, 8):     # 2,3,4,5,6,7
    print(i, end=" ")
for i in range(0, 10, 2):  # 0,2,4,6,8 步长为2
    print(i, end=" ")

# zip 并行遍历
names = ["张三", "李四"]
ages = [25, 30]
for name, age in zip(names, ages):
    print(f"{name}: {age}岁")

# dict 遍历
scores = {"语文": 90, "数学": 95}
for k, v in scores.items():
    print(f"{k}: {v}")

# itertools.product 嵌套循环替代
from itertools import product
colors = ["红", "蓝"]
sizes = ["S", "M", "L"]
for c, s in product(colors, sizes):
    print(f"{c}-{s}")

4️⃣ while 循环

# 基本 while
count = 0
while count < 5:
    print(count, end=" ")
    count += 1
# 输出: 0 1 2 3 4

# while-else(循环正常结束时执行 else)
n = 17
i = 2
while i < n:
    if n % i == 0:
        print(f"{n} 不是质数")
        break
    i += 1
else:
    print(f"{n} 是质数")  # 17 是质数

# 使用哨兵值
while True:
    line = input(">>> ")
    if line == "quit":
        break
    print(f"你输入了: {line}")

5️⃣ 循环控制:break / continue / else

# break - 跳出整个循环
for i in range(10):
    if i == 5:
        break
    print(i, end=" ")  # 0 1 2 3 4

# continue - 跳过当前迭代
for i in range(10):
    if i % 2 == 0:
        continue
    print(i, end=" ")  # 1 3 5 7 9

# for-else - 没被break中断时执行
def find_first_even(numbers):
    for n in numbers:
        if n % 2 == 0:
            print(f"找到偶数: {n}")
            break
    else:
        print("未找到偶数")

find_first_even([1, 3, 5, 4, 7])  # 找到偶数: 4
find_first_even([1, 3, 5, 7])    # 未找到偶数

6️⃣ 推导式(Comprehension)

推导式是 Python 最优雅的特性之一,用一行代码替代循环+append。

列表推导式

# 基本形式
squares = [x**2 for x in range(10)]
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 带条件过滤
evens = [x for x in range(20) if x % 2 == 0]
# [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# 带条件表达式
labels = ["偶" if x % 2 == 0 else "奇" for x in range(5)]
# ['偶', '奇', '偶', '奇', '偶']

# 嵌套推导式(扁平化矩阵)
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [x for row in matrix for x in row]
# [1, 2, 3, 4, 5, 6, 7, 8, 9]

字典推导式

# 列表转字典
names = ["张三", "李四", "王五"]
name_len = {name: len(name) for name in names}
# {'张三': 2, '李四': 2, '王五': 2}

# 键值互换
original = {"a": 1, "b": 2, "c": 3}
swapped = {v: k for k, v in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}

# 从两个列表创建字典
keys = ["name", "age", "city"]
vals = ["张三", 28, "北京"]
person = dict(zip(keys, vals))

集合推导式

# 提取唯一长度
words = ["apple", "banana", "cherry", "date"]
lengths = {len(w) for w in words}
# {5, 6, 4}

生成器表达式

# 惰性计算,节省内存
total = sum(x**2 for x in range(1000000))
# 不会创建百万元素的列表!

# 任何接受可迭代对象的函数都能用
max_len = max(len(w) for w in words)
any_even = any(x % 2 == 0 for x in [1, 3, 5, 4])
all_pos = all(x > 0 for x in [1, 2, 3])
💡 推导式 vs 循环:推导式更简洁更快(C层面优化),但如果逻辑超过一行,用普通循环更可读。可读性 > 简洁性。

7️⃣ 验证脚本

#!/usr/bin/env python3
"""第03课 流程控制验证"""

def test_if_else():
    """条件判断测试"""
    score = 85
    if score >= 90:
        grade = "优秀"
    elif score >= 80:
        grade = "良好"
    elif score >= 60:
        grade = "及格"
    else:
        grade = "不及格"
    assert grade == "良好"

    # 三元表达式
    status = "成年" if 20 >= 18 else "未成年"
    assert status == "成年"
    print("✅ if/elif/else 测试通过")

def test_match_case():
    """模式匹配测试"""
    def handle(cmd):
        match cmd.split():
            case ["quit"]:
                return "exit"
            case ["goto", dest]:
                return f"go:{dest}"
            case _:
                return "unknown"
    assert handle("quit") == "exit"
    assert handle("goto 北京") == "go:北京"
    assert handle("xyz") == "unknown"
    print("✅ match-case 测试通过")

def test_for_loop():
    """for循环测试"""
    result = []
    for i in range(5):
        result.append(i)
    assert result == [0, 1, 2, 3, 4]

    # enumerate
    fruits = ["苹果", "香蕉"]
    pairs = list(enumerate(fruits))
    assert pairs == [(0, "苹果"), (1, "香蕉")]

    # zip
    names = ["A", "B"]
    ages = [20, 30]
    zipped = list(zip(names, ages))
    assert zipped == [("A", 20), ("B", 30)]
    print("✅ for循环 测试通过")

def test_while_loop():
    """while循环测试"""
    total = 0
    i = 1
    while i <= 100:
        total += i
        i += 1
    assert total == 5050
    print("✅ while循环 测试通过")

def test_comprehension():
    """推导式测试"""
    # 列表推导式
    squares = [x**2 for x in range(5)]
    assert squares == [0, 1, 4, 9, 16]

    # 带条件
    evens = [x for x in range(10) if x % 2 == 0]
    assert evens == [0, 2, 4, 6, 8]

    # 字典推导式
    swapped = {v: k for k, v in {"a": 1, "b": 2}.items()}
    assert swapped == {1: "a", 2: "b"}

    # 集合推导式
    lengths = {len(w) for w in ["hi", "hey", "hello"]}
    assert lengths == {2, 3, 5}

    # 生成器表达式
    total = sum(x**2 for x in range(4))
    assert total == 14  # 0+1+4+9

    print("✅ 推导式 测试通过")

if __name__ == "__main__":
    test_if_else()
    test_match_case()
    test_for_loop()
    test_while_loop()
    test_comprehension()
    print("\n🎉 第03课全部验证通过!")
✅ if/elif/else 测试通过 ✅ match-case 测试通过 ✅ for循环 测试通过 ✅ while循环 测试通过 ✅ 推导式 测试通过 🎉 第03课全部验证通过!

🔑 本课要点

  1. match-case——Python 3.10+ 的模式匹配,比 if-elif 链更强大
  2. 海象运算符 :=——在条件中赋值,消除重复计算
  3. 推导式——Python 最优雅的特性,一行胜多行
  4. for-else / while-else——循环没被 break 时执行 else
  5. 生成器表达式——惰性计算,处理大数据不爆内存