# 字面量模式 defhttp_status(status: int) -> str: match status: case200: return"OK" case301: return"Moved Permanently" case400: return"Bad Request" case404: return"Not Found" case500: return"Internal Server Error" case _: return"Unknown Status"
# 序列模式——解构与捕获 defprocess_command(command: str) -> str: match command.split(): case ["quit"]: return"退出程序" case ["hello", name]: returnf"你好,{name}!" case ["add", x, y]: returnf"结果:{int(x) + int(y)}" case ["list", *items]: returnf"列表:{items}" case _: return"未知命令"
# 映射模式——字典解构 defhandle_event(event: dict) -> str: match event: case {"type": "click", "x": x, "y": y}: returnf"点击位置:({x}, {y})" case {"type": "key", "key": key}: returnf"按键:{key}" case {"type": "scroll", "delta": delta} if delta > 0: return"向上滚动" case {"type": "scroll"}: return"向下滚动" case _: return"未知事件"
# 类模式——对象解构 from dataclasses import dataclass
@dataclass classPoint: x: float y: float
defdescribe_point(point: Point) -> str: match point: case Point(x=0, y=0): return"原点" case Point(x=0, y=y): returnf"Y轴上,y={y}" case Point(x=x, y=0): returnf"X轴上,x={x}" case Point(x=x, y=y): returnf"坐标({x}, {y})"
# OR模式与守卫条件 defclassify(value: int) -> str: match value: case0 | 1: return"二进制位" case n if n < 0: return"负数" case n if n > 100: return"大数" case _: return"普通正数"
for row in matrix: for item in row: print(item, end=" ") print()
# 对角线遍历 for i inrange(len(matrix)): print(matrix[i][i], end=" ") print()
4.3 循环控制
4.3.1 break——提前终止循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
for i inrange(10): if i == 5: break print(i) # 0, 1, 2, 3, 4
# 实用:查找第一个满足条件的元素 deffind_first_even(numbers: list) -> int | None: for num in numbers: if num % 2 == 0: return num returnNone
# 注意:break只跳出最内层循环 for i inrange(3): for j inrange(3): if i == 1and j == 1: break# 只跳出内层循环 print(f"({i}, {j})")
4.3.2 continue——跳过当前迭代
1 2 3 4 5 6 7 8 9 10 11 12
# 只打印奇数 for i inrange(10): if i % 2 == 0: continue print(i) # 1, 3, 5, 7, 9
# 过滤无效数据 records = [{"name": "Alice", "age": 25}, None, {"name": "Bob", "age": 30}] for record in records: if record isNone: continue print(f"{record['name']}: {record['age']}岁")
4.3.3 pass——空操作占位
1 2 3 4 5 6 7 8 9 10
# 占位:待实现 classMyError(Exception): pass
deftodo_function(): pass
# pass vs ...(Ellipsis) deftodo_function(): ... # 等价于pass,某些团队偏好此写法
# 配合聚合函数使用(最常见场景) total = sum(x ** 2for x inrange(100)) maximum = max(x ** 2for x inrange(100)) has_any = any(x < 0for x in [1, 2, 3]) all_positive = all(x > 0for x in [1, 2, 3])
defbubble_sort(arr: list) -> list: """冒泡排序:O(n²)时间复杂度""" n = len(arr) for i inrange(n): swapped = False for j inrange(0, n - i - 1): if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] swapped = True ifnot swapped: break return arr
print(bubble_sort([64, 34, 25, 12, 22, 11, 90]))
快速排序
1 2 3 4 5 6 7 8 9 10 11 12 13
defquick_sort(arr: list) -> list: """快速排序:平均O(n log n)""" iflen(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right)
deffibonacci_iterative(n: int) -> list: """迭代法:O(n)时间,O(n)空间""" if n <= 0: return [] if n == 1: return [0] fib = [0, 1] for i inrange(2, n): fib.append(fib[i-1] + fib[i-2]) return fib
deffibonacci_generator(): """生成器版本:无限序列""" a, b = 0, 1 whileTrue: yield a a, b = b, a + b
from itertools import islice print(list(islice(fibonacci_generator(), 10)))
defanalyze_complexity(): """常见循环模式的时间复杂度""" # O(n) - 单层循环 defo_n(n): for i inrange(n): pass # O(n²) - 嵌套循环 defo_n_squared(n): for i inrange(n): for j inrange(n): pass # O(log n) - 对数循环 defo_log_n(n): i = 1 while i < n: i *= 2 # O(n log n) - 线性对数 defo_n_log_n(n): for i inrange(n): j = 1 while j < n: j *= 2 # O(√n) - 平方根循环 defo_sqrt_n(n): i = 1 while i * i < n: i += 1
analyze_complexity()
复杂度
名称
示例
n=1000时操作数
O(1)
常数
数组索引
1
O(log n)
对数
二分查找
10
O(√n)
平方根
质数判断
32
O(n)
线性
单层循环
1000
O(n log n)
线性对数
快速排序
10000
O(n²)
平方
嵌套循环
1000000
O(2ⁿ)
指数
递归斐波那契
10³⁰¹
4.7 前沿技术动态
4.7.1 结构化模式匹配(PEP 634)
Python 3.10引入的模式匹配提供了强大的控制流表达能力:
1 2 3 4 5 6 7 8 9 10 11 12
defprocess_event(event: dict) -> str: match event: case {"type": "login", "user": str(name)}: returnf"User {name} logged in" case {"type": "logout", "user": str(name), "reason": reason}: returnf"User {name} logged out: {reason}" case {"type": "error", "code": code} if code >= 500: returnf"Server error: {code}" case {"type": "error", "code": code}: returnf"Client error: {code}" case _: return"Unknown event"
4.7.2 异步迭代与循环
现代Python支持异步迭代器和异步for循环:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
import asyncio
asyncdefasync_count(n: int): for i inrange(n): await asyncio.sleep(0.1) yield i
asyncdefmain(): asyncfor num in async_count(5): print(num)
asyncfor num in async_count(3): if num == 1: continue print(f"Got: {num}")
asyncio.run(main())
4.7.3 性能优化技术
1 2 3 4 5 6 7 8 9 10 11 12
import itertools
# 使用itertools替代显式循环 data = range(1000000)
sum_result = sum(data) any_positive = any(x > 0for x in data) all_positive = all(x >= 0for x in data)