—— 让程序学会做决策
# 基本条件
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("管理员账户")
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']
# 基本遍历
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}")
# 基本 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}")
# 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]) # 未找到偶数
推导式是 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])
#!/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课全部验证通过!")