1. 项目概述:上机练习的第三天意味着什么

当程序员连续第三天坐在电脑前敲代码时,往往意味着进入了技能提升的关键阶段。前两天的练习可能还在熟悉环境和基础语法,而第三天开始真正触及编程思维的形成。就像学游泳时,前两次课还在练习憋气和漂浮,第三次课就要开始尝试完整的划水动作了。

我在带新人时发现,第三天通常是分水岭——要么突然开窍,要么陷入瓶颈。这个阶段的练习内容需要精心设计:既不能重复基础语法练习让人感到无聊,又不能难度陡增导致挫败感。好的第三天练习应该包含以下特征:

  • 综合运用前两天学过的知识点
  • 引入1-2个新概念形成适当挑战
  • 有可见的输出结果增强成就感
  • 预留debug时间培养问题解决能力

2. 典型第三天练习内容设计

2.1 控制结构与数据结构的结合练习

第三天最适合将条件判断、循环等控制结构与数组、字典等数据结构结合起来。比如这个经典的购物车练习:

# 商品数据库
products = {
    "A001": {"name": "无线鼠标", "price": 89},
    "B205": {"name": "机械键盘", "price": 299},
    "C076": {"name": "USB扩展坞", "price": 59}
}

# 购物车功能实现
cart = {}
while True:
    print("\n当前商品列表:")
    for code, item in products.items():
        print(f"{code}: {item['name']} ¥{item['price']}")
    
    choice = input("输入商品编号加入购物车(Q退出): ").upper()
    if choice == 'Q':
        break
        
    if choice in products:
        cart[choice] = cart.get(choice, 0) + 1
        print(f"已添加 {products[choice]['name']}")
    else:
        print("无效的商品编号!")

# 结算功能
total = 0
print("\n=== 购物清单 ===")
for code, quantity in cart.items():
    item = products[code]
    subtotal = item['price'] * quantity
    print(f"{item['name']} x{quantity}: ¥{subtotal}")
    total += subtotal
print(f"总计: ¥{total}")

这个练习融合了:

  • 字典的嵌套使用
  • while循环控制流程
  • 条件判断处理用户输入
  • 累加器计算总价
  • 简单的用户交互界面

2.2 文件操作与异常处理

第三天也是引入文件操作的好时机。比如实现一个简单的日记本程序:

import datetime

def write_diary():
    today = datetime.date.today()
    filename = f"diary_{today.year}{today.month:02d}{today.day:02d}.txt"
    
    try:
        with open(filename, 'a', encoding='utf-8') as f:
            print(f"\n今天是 {today.year}年{today.month}月{today.day}日")
            content = input("请输入今天的日记内容:\n")
            f.write(f"{datetime.datetime.now()}\n{content}\n\n")
            print("日记已保存!")
    except PermissionError:
        print("错误:没有文件写入权限!")
    except Exception as e:
        print(f"保存失败:{str(e)}")

def read_diary():
    date_str = input("输入要查看的日记日期(YYYYMMDD):")
    filename = f"diary_{date_str}.txt"
    
    try:
        with open(filename, 'r', encoding='utf-8') as f:
            print(f"\n=== {date_str}的日记 ===")
            print(f.read())
    except FileNotFoundError:
        print("找不到指定日期的日记")
    except Exception as e:
        print(f"读取失败:{str(e)}")

# 主程序
while True:
    print("\n1. 写日记")
    print("2. 读日记")
    print("3. 退出")
    choice = input("请选择操作:")
    
    if choice == '1':
        write_diary()
    elif choice == '2':
        read_diary()
    elif choice == '3':
        break
    else:
        print("无效输入!")

这个案例教会学员:

  • 使用datetime处理日期时间
  • 文件读写的基本操作
  • try-except异常处理机制
  • 字符串格式化技巧
  • 简单的菜单驱动界面

3. 第三天练习的常见问题与解决方案

3.1 变量作用域混淆

新手常犯的错误是在函数内外使用同名变量却不理解作用域规则:

count = 0  # 全局变量

def increment():
    count += 1  # 这里会报UnboundLocalError
    print(count)

increment()

解决方案是明确讲解global关键字的作用:

count = 0

def increment():
    global count
    count += 1
    print(count)

或者更推荐的方式是避免使用全局变量:

def increment_counter(counter):
    return counter + 1

count = 0
count = increment_counter(count)
print(count)

3.2 无限循环陷阱

第三天练习开始使用while循环后,经常会出现循环停不下来的情况:

# 错误示例
n = 0
while n < 10:
    print(n)
    # 忘记写 n += 1

教学时要强调循环三要素:

  1. 初始条件 (n = 0)
  2. 循环条件 (n < 10)
  3. 条件更新 (n += 1)

建议在代码中显式注释这三个部分。

3.3 字符串与数字混用

类型错误是第三天的常见问题:

price = "29.9"  # 字符串
quantity = 2
total = price * quantity  # 会得到"29.929.9"而不是59.8

解决方法包括:

  • 使用type()函数检查类型
  • 讲解int()/float()/str()转换函数
  • 推荐使用f-string格式化输出:
print(f"总价: ¥{float(price) * quantity:.2f}")

4. 进阶挑战:第三天可以尝试的小项目

4.1 简易计算器

def calculate():
    print("简易计算器(支持+-*/)")
    try:
        num1 = float(input("输入第一个数字: "))
        op = input("输入运算符(+-*/): ")
        num2 = float(input("输入第二个数字: "))
        
        if op == '+':
            result = num1 + num2
        elif op == '-':
            result = num1 - num2
        elif op == '*':
            result = num1 * num2
        elif op == '/':
            if num2 == 0:
                raise ValueError("除数不能为零")
            result = num1 / num2
        else:
            raise ValueError("无效的运算符")
            
        print(f"结果: {result}")
    except ValueError as e:
        print(f"输入错误: {e}")
    except Exception as e:
        print(f"计算错误: {e}")

# 添加循环功能
while True:
    calculate()
    again = input("继续计算?(y/n): ").lower()
    if again != 'y':
        break

4.2 猜数字游戏

import random

def guess_number():
    target = random.randint(1, 100)
    attempts = 0
    
    print("猜数字游戏(1-100)")
    while True:
        try:
            guess = int(input("你的猜测: "))
            attempts += 1
            
            if guess < target:
                print("猜小了!")
            elif guess > target:
                print("猜大了!")
            else:
                print(f"恭喜!你用了{attempts}次猜中数字{target}")
                break
                
        except ValueError:
            print("请输入有效数字!")

# 添加游戏统计功能
games_played = 0
best_score = float('inf')

while True:
    guess_number()
    games_played += 1
    
    # 这里可以添加统计逻辑
    # ...
    
    play_again = input("再玩一次?(y/n): ").lower()
    if play_again != 'y':
        print(f"游戏结束。共玩了{games_played}局")
        break

5. 教学经验分享:如何设计好的第三天练习

根据我多年的教学经验,好的第三天练习应该:

  1. 建立正向反馈循环

    • 确保每个练习都有可见的输出结果
    • 适当加入图形化输出(如ASCII艺术)增加趣味性
    • 在代码中加入鼓励性的print语句
  2. 控制难度曲线

    • 新概念不超过2个/练习
    • 保留30%的熟悉内容用于巩固
    • 提供标准答案的同时展示常见错误
  3. 培养debug习惯

    • 故意在示例代码中留一些错误让学生发现
    • 教授使用print调试法
    • 讲解如何阅读错误信息
  4. 项目导向设计

    • 每个练习都应该是完整的小功能
    • 最后一天可以把多个小练习组合成完整项目
    • 提供扩展思考题给学得快的学生

关键提示:第三天结束时,一定要让学生能做出"看起来像真正程序"的东西,这对保持学习动力至关重要。哪怕只是一个能保存数据的记事本,也比无数个孤立的语法练习更有成就感。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐