跳转至

02 - 手写代码练习计划

目标:能不依赖AI,独立手写100行以上的代码

时间:2-3周

核心原则:看懂≠会写,会写才算掌握


🎯 为什么必须手写?

看懂 vs 会写

Text Only
看懂AI的代码:
- 大脑:"哦,原来是这样"
- 手:"我不会写"

自己手写代码:
- 大脑:"我要怎么实现?"
- 手:"我写出来了"
- 大脑:"我真正理解了"

手写代码的好处

  1. 暴露知识盲点
  2. 以为自己懂了,写的时候才发现漏洞

  3. 加深记忆

  4. 肌肉记忆 + 逻辑记忆 = 长期记忆

  5. 建立信心

  6. "我能独立写出来" → 自信心提升

  7. 面试必备

  8. 面试时不能查资料、不能问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. 先想后写

不要边想边写,先想清楚逻辑:

Text Only
步骤1:在纸上写出伪代码
步骤2:检查逻辑是否正确
步骤3:翻译成Python代码

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周,你会发现自己脱胎换骨! 💪