02 - 手写代码练习计划¶
目标:能不依赖AI,独立手写100行以上的代码
时间:2-3周
核心原则:看懂≠会写,会写才算掌握
🎯 为什么必须手写?¶
看懂 vs 会写¶
手写代码的好处¶
- 暴露知识盲点
-
以为自己懂了,写的时候才发现漏洞
-
加深记忆
-
肌肉记忆 + 逻辑记忆 = 长期记忆
-
建立信心
-
"我能独立写出来" → 自信心提升
-
面试必备
- 面试时不能查资料、不能问AI
📝 练习计划¶
第一周:基础语法强化¶
目标:不查资料,手写基础代码
Day 1-2: 数据结构与控制流¶
练习1:列表操作(限时15分钟,不能查资料)
Python
# 1. 创建一个包含1-10的列表
def create_list():
# 手写代码
pass
# 2. 计算列表平均值
def list_average(arr):
# 手写代码
pass
# 3. 找出列表中的最大值和最小值
def find_min_max(arr):
# 手写代码
pass
# 4. 反转列表(不能用reverse)
def reverse_list(arr):
# 手写代码
pass
# 5. 删除列表中的重复元素
def remove_duplicates(arr):
# 手写代码
pass
练习2:字典操作(限时15分钟)
Python
# 1. 统计字符串中每个字符出现的次数
def char_count(s):
# 手写代码
pass
# 2. 合并两个字典
def merge_dicts(d1, d2):
# 手写代码
pass
# 3. 按键排序字典
def sort_dict_by_key(d):
# 手写代码
pass
# 4. 找出字典中值最大的键
def find_max_key(d):
# 手写代码
pass
Day 3-4: 函数与模块¶
练习3:函数编写(限时20分钟)
Python
# 1. 实现map函数(不能用内置map)
def my_map(func, iterable):
"""对iterable中的每个元素应用func"""
# 手写代码
pass
# 2. 实现filter函数
def my_filter(func, iterable):
"""返回使func返回True的元素"""
# 手写代码
pass
# 3. 实现reduce函数
from functools import reduce
def my_reduce(func, iterable, initializer=None):
"""累积计算"""
# 手写代码
pass
# 4. 实现zip函数
def my_zip(*iterables):
"""将多个可迭代对象打包成元组"""
# 手写代码
pass
Day 5-7: 文件与异常¶
练习4:文件操作(限时20分钟)
Python
# 1. 读取文件并统计行数
def count_lines(filename):
# 手写代码
pass
# 2. 复制文件
def copy_file(src, dst):
# 手写代码
pass
# 3. 安全的文件读取(处理异常)
def safe_read(filename):
"""读取文件,如果文件不存在返回空字符串"""
# 手写代码
pass
# 4. 追加写入文件
def append_to_file(filename, content):
# 手写代码
pass
第二周:算法与数据结构¶
目标:手写基础数据结构和算法
Day 8-9: 基础数据结构¶
练习5:实现栈(限时30分钟)
Python
class Stack:
"""用列表实现栈"""
def __init__(self):
# 手写代码
pass
def push(self, item):
# 手写代码
pass
def pop(self):
# 手写代码
pass
def peek(self):
# 手写代码
pass
def is_empty(self):
# 手写代码
pass
def size(self):
# 手写代码
pass
# 测试
stack = Stack()
stack.push(1)
stack.push(2)
stack.push(3)
print(stack.pop()) # 3
print(stack.peek()) # 2
print(stack.size()) # 2
练习6:实现队列(限时30分钟)
Python
class Queue:
"""用列表实现队列"""
def __init__(self):
# 手写代码
pass
def enqueue(self, item):
# 手写代码
pass
def dequeue(self):
# 手写代码
pass
def front(self):
# 手写代码
pass
def is_empty(self):
# 手写代码
pass
def size(self):
# 手写代码
pass
Day 10-11: 排序算法¶
练习7:手写排序(每个限时20分钟)
Python
# 1. 冒泡排序
def bubble_sort(arr):
"""
思路:重复遍历数组,比较相邻元素,如果顺序错误就交换
"""
# 手写代码
pass
# 2. 选择排序
def selection_sort(arr):
"""
思路:每次从未排序部分选择最小元素,放到已排序部分末尾
"""
# 手写代码
pass
# 3. 插入排序
def insertion_sort(arr):
"""
思路:将元素逐个插入到已排序部分的正确位置
"""
# 手写代码
pass
# 4. 快速排序
def quick_sort(arr):
"""
思路:选择pivot,将数组分为小于pivot和大于pivot两部分,递归排序
"""
# 手写代码
pass
Day 12-14: 搜索算法¶
练习8:手写搜索(每个限时15分钟)
Python
# 1. 线性搜索
def linear_search(arr, target):
"""遍历数组,找到target返回索引,否则返回-1"""
# 手写代码
pass
# 2. 二分搜索(数组已排序)
def binary_search(arr, target):
"""
思路:
1. 比较target和中间元素
2. 如果相等,返回索引
3. 如果target小,在左半部分继续搜索
4. 如果target大,在右半部分继续搜索
"""
# 手写代码
pass
# 3. 二分搜索(递归版本)
def binary_search_recursive(arr, target, left, right):
# 手写代码
pass
第三周:综合项目¶
目标:独立完成小型项目
Day 15-17: 命令行工具¶
项目1:待办事项管理器(限时2小时)
Python
"""
实现一个命令行待办事项管理器,支持:
1. 添加任务
2. 列出所有任务
3. 标记任务完成
4. 删除任务
5. 保存到文件
数据存储用JSON文件
"""
import json
import os
class TodoManager:
def __init__(self, filename='todos.json'):
self.filename = filename
self.todos = []
self.load()
def load(self):
"""从文件加载待办事项"""
# 手写代码
pass
def save(self):
"""保存到文件"""
# 手写代码
pass
def add(self, task):
"""添加任务"""
# 手写代码
pass
def list_all(self):
"""列出所有任务"""
# 手写代码
pass
def complete(self, index):
"""标记任务完成"""
# 手写代码
pass
def delete(self, index):
"""删除任务"""
# 手写代码
pass
def main():
"""命令行界面"""
# 手写代码
pass
if __name__ == '__main__':
main()
Day 18-21: 数据处理项目¶
项目2:简易数据分析工具(限时3小时)
Python
"""
实现一个简易数据分析工具,支持:
1. 读取CSV文件
2. 计算基本统计信息(均值、中位数、标准差)
3. 数据过滤
4. 生成简单报告
"""
import csv
import math
class DataAnalyzer:
def __init__(self, filename):
self.filename = filename
self.data = []
self.load()
def load(self):
"""加载CSV文件"""
# 手写代码
pass
def mean(self, column):
"""计算某列的均值"""
# 手写代码
pass
def median(self, column):
"""计算某列的中位数"""
# 手写代码
pass
def std(self, column):
"""计算某列的标准差"""
# 手写代码
pass
def filter_by(self, column, condition):
"""按条件过滤数据"""
# 手写代码
pass
def generate_report(self):
"""生成数据报告"""
# 手写代码
pass
# 测试
df = DataAnalyzer('data.csv')
print(df.mean('age'))
print(df.median('salary'))
print(df.generate_report())
✅ 检查标准¶
每个练习完成后检查:¶
- 没有查任何资料(包括AI、Google、文档)
- 代码能正确运行
- 能解释每一行代码的作用
- 能说出时间复杂度和空间复杂度
- 能处理边界情况
阶段完成检查:¶
- 第一周:能在15分钟内完成基础语法练习
- 第二周:能在30分钟内完成数据结构和算法
- 第三周:能在3小时内完成综合项目
- 总共:能不依赖AI写出100行以上代码
🎯 进阶挑战¶
如果你完成了基础练习,尝试以下挑战:
挑战1:限时手写¶
给自己设定更短的时间: - 冒泡排序:5分钟 - 快速排序:10分钟 - 二分搜索:5分钟 - 链表反转:10分钟
挑战2:白板编程¶
在纸上/白板上写代码,不能运行测试: - 训练逻辑严谨性 - 训练代码组织能力
挑战3:变式练习¶
在基础版本上增加功能: - 栈:增加获取最小值功能(O(1)) - 队列:用两个栈实现 - 排序:实现归并排序、堆排序
💡 技巧与建议¶
1. 先想后写¶
不要边想边写,先想清楚逻辑:
2. 从简单开始¶
如果写不出来,先写简化版:
Python
# 目标:快速排序
# 简化版:只处理3个元素
def quick_sort_simple(arr):
if len(arr) <= 1:
return arr
# 先处理3个元素的情况
# ...
# 测试通过后再扩展
def quick_sort(arr):
# 完整版
pass
3. 调试技巧¶
如果代码不对,用print定位问题:
Python
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
print(f"left={left}, right={right}, mid={mid}, arr[mid]={arr[mid]}")
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
4. 记录错误¶
建立错误记录本:
Markdown
## 错误记录
### 2026-01-29
**问题**:快速排序死循环
**原因**:pivot选择不当,导致分区后数组不变
**解决**:随机选择pivot或选择中间元素
**教训**:注意分区后的数组大小
📚 下一步¶
完成手写代码练习后,进入 03-调试与问题解决能力.md
记住:手写代码是痛苦的,但痛苦意味着成长。坚持3周,你会发现自己脱胎换骨! 💪