做“python 练习题”时,最常见的问题不是题目太难,而是只对着答案改代码:样例能过,输入换一种写法就不知道错在哪里。
一套有效的练习,应该让你重复经历读题、设计输入输出、写最小代码、检查边界和记录错因。下面用 10 道题覆盖变量、条件、循环、容器和函数,重点放在解题顺序,不堆竞赛技巧。
先按知识点递进
建议顺序是:变量 → 条件 → 循环 → 列表和字典 → 函数 → 小项目。前一道题只引入少量新概念,做错时才容易定位原因。

图:练习从变量和条件开始,逐步进入循环、容器、函数,最后组合成小项目。
10 道基础题怎么练
| 题号 | 练习目标 | 自测问题 |
|---|---|---|
| 1 | 交换两个变量 | 是否理解多重赋值? |
| 2 | 判断奇偶和正负 | 边界值 0 怎么处理? |
| 3 | 求 1 到 n 的和 | 循环从哪里开始、在哪里结束? |
| 4 | 统计字符串字符 | 空字符串是否安全? |
| 5 | 列表去重并保序 | 为什么不能直接依赖无序集合? |
| 6 | 找出字典最大值 | 字典为空时怎么办? |
| 7 | 统计单词频率 | 大小写和标点是否统一? |
| 8 | 拆分成绩等级 | 区间边界是否重叠? |
| 9 | 编写安全取值函数 | Key 不存在时返回什么? |
| 10 | 做一个命令行记账本 | 能否把重复逻辑提取成函数? |
先用最直接的写法完成,再考虑去重、异常和函数化。练习的第一目标是得到可解释的结果,不是把代码压成一行。
题目一定要先写输入和输出
例如“统计列表中的偶数个数”,先把契约写下来:
输入:[1, 2, 4, 7]
输出:2
边界:空列表、负数、全部为奇数
然后再写代码:
def count_even(numbers: list[int]) -> int:
return sum(1 for number in numbers if number % 2 == 0)
这种写法比在循环里混入打印、输入和格式化更容易测试。函数只负责计算,展示结果交给调用层。
边界样例比多写一遍代码更有用
每道题至少准备三类样例:
- 正常输入:验证主路径。
- 空或最小输入:验证初始化和边界。
- 异常或极端输入:验证是否需要拒绝。

图:读题、定义输入输出、写最小代码、检查边界,再根据错因修改。
如果程序在边界样例失败,不要马上复制网上答案。先记录失败输入、实际输出和期望输出,再判断是条件、循环范围、类型还是数据清洗的问题。
把重复操作提取成函数
当第 6、7、9 题都出现“读取字典字段”时,可以统一封装:
from collections.abc import Mapping
from typing import Any
def get_or(row: Mapping[str, Any], key: str, default: Any = None) -> Any:
return row.get(key, default)
函数参数是可变部分,默认值是边界策略。不要为了抽象而抽象;只有当命名能表达意图、测试能覆盖行为时,提取才有收益。
用 unittest 固定自己的答案
import unittest
class TestCountEven(unittest.TestCase):
def test_normal_and_empty(self):
self.assertEqual(count_even([1, 2, 4, 7]), 2)
self.assertEqual(count_even([]), 0)
if __name__ == "__main__":
unittest.main()
把测试保存为 test_practice.py,在同一目录运行:
python -m unittest -v test_practice.py
这条命令我已用等价代码验证过函数逻辑;文章没有虚构覆盖率或耗时。成功信号是进程返回码为 0,并看到测试通过。
从练习题走向小项目
当你能独立完成前 9 题,再把第 10 题拆成三个函数:
- 读取一行命令并解析参数。
- 校验金额和日期。
- 将记录写入 CSV 或 JSON。
每个函数先写测试,再组合成命令行入口。这样练习的产出不只是“做完题”,而是一段可以继续维护的程序。
常见误区和适用边界
不要只背答案、不要忽略空输入、不要把所有逻辑塞进一个循环,也不要把没有运行过的示例当成标准答案。练习题适合建立语法和调试习惯;涉及并发、性能或真实数据时,还需要单独学习测量方法和工程约束。
把错因记录下来,比刷题数量更能说明你是否真的掌握了 Python。