别人花钱买练习册?Python免费给你出一万套数学试卷,自带自动批改!
开篇小故事
"妈妈,练习册做完了,还有没有题可以练?"
六年级的浩浩把一本数学练习册从头做到尾,还想继续练。
妈妈正准备上网买新练习册,浩浩说:"不用买!我用 Python 写一个自动出题的程序,要多少题有多少题!"
二十分钟后,浩浩不仅有了一个"无限出题机",还带自动批改和计时功能。
"这个比练习册还好用,因为我可以只练我出错的那些题!"
你能学到什么
直接上代码
基础版:随机出 10 道加减法
import randomimport timeprint("=== 数学小测验 ===")print("准备好了吗?开始答题!\n")score = 0start_time = time.time() # 记录开始时间for i in range(1, 11): a = random.randint(1, 99) b = random.randint(1, 99) correct = a + b answer = input(f"第{i}题:{a} + {b} = ") if answer.isdigit() and int(answer) == correct: print("✓ 正确!\n") score += 1 else: print(f"✗ 错误!正确答案是 {correct}\n")end_time = time.time()used_time = round(end_time - start_time, 1)print(f"===== 测验结束 =====")print(f"得分:{score} / 10")print(f"用时:{used_time} 秒")print(f"正确率:{score * 10}%")
代码讲解
| |
|---|
random.randint(1, 99) | |
time.time() | |
answer.isdigit() | |
int(answer) == correct | |
进阶版:加减乘除随机混合
import randomimport timeops = ["+", "-", "×"]score = 0wrong_list = [] # 记录错题print("=== 四则运算大挑战 ===\n")start_time = time.time()for i in range(1, 11): a = random.randint(1, 99) b = random.randint(1, 99) op = random.choice(ops) # 根据运算符计算结果 if op == "+": correct = a + b elif op == "-": # 保证结果不为负数 if a < b: a, b = b, a correct = a - b else: # "×" correct = a * b answer = input(f"第{i}题:{a} {op} {b} = ") if answer.lstrip("-").isdigit() and int(answer) == correct: print("✓ 正确!\n") score += 1 else: print(f"✗ 错误!正确答案是 {correct}\n") wrong_list.append(f"{a} {op} {b} = {correct}")end_time = time.time()print(f"===== 成绩单 =====")print(f"得分:{score} / 10")print(f"用时:{round(end_time - start_time, 1)} 秒")if wrong_list: print(f"\n错题本(记得再练一遍哦):") for w in wrong_list: print(f" · {w}")else: print("\n全部正确!你太厉害了!")
超进阶版:分难度等级
import randomimport timeprint("选择难度:")print("1. 简单(20以内加减法)")print("2. 中等(100以内四则运算)")print("3. 困难(三位数乘除法)")level = input("请选择(1/2/3):")if level == "1": max_num = 20 ops_list = ["+", "-"]elif level == "2": max_num = 100 ops_list = ["+", "-", "×"]else: max_num = 999 # 更友好一些 ops_list = ["×", "÷"]score = 0start_time = time.time()for i in range(1, 11): a = random.randint(1, max_num) b = random.randint(1, min(max_num, 99)) op = random.choice(ops_list) if op == "+": correct = a + b elif op == "-": if a < b: a, b = b, a correct = a - b elif op == "×": correct = a * b else: # "÷" # 确保能整除,且除数不为0 correct = random.randint(1, min(a, 99)) b = random.randint(1, min(a, 12)) a = correct * b correct_display = correct if op == "÷": answer = input(f"第{i}题:{a} {op} {b} = ") else: answer = input(f"第{i}题:{a} {op} {b} = ") try: if op == "÷": user_ans = int(answer) else: user_ans = int(answer) if user_ans == correct: print("✓\n") score += 1 else: print(f"✗ 答案是 {correct}\n") except: print(f"✗ 请输入数字!答案是 {correct}\n")end_time = time.time()print(f"得分:{score}/10,用时:{round(end_time - start_time, 1)}秒")
试试加点变化?
| |
|---|
| 把 range(1, 11) 的 11 改成 题目数+1 |
| 用上期学的 Fraction 模块自动出分数运算题 |
| if used_time > 60: print("超时了!") |
| |
| |
易错点提醒
| | |
|---|
| int("abc") | 用 .isdigit() 检查,或用 try/except |
| | |
| | |
学校信息课考点预告
本期是前几期的综合应用:
- • 程序与数学的深度融合——新课标"计算思维"核心体现
家长辅导小贴士
- 1. 先选简单难度,让孩子在 20 以内加减法中建立信心。不要一上来就挑战困难模式。
- 2. 比赛模式:和孩子各做一套 10 题,比谁又快又对。输的人做俯卧撑!
- 3. 关注错题:程序记录的错题,恰恰是孩子数学的薄弱环节。把错题抄下来,和孩子一起分析错在哪里。
- 4. 让孩子自己改程序:比如"能不能加入除法?""能不能显示排名?"——这是培养编程兴趣最好的方式。
- 5. 如果孩子对
random 模块好奇,可以解释:"random 就像一个骰子,每次都能掷出不同的数字。但它是靠一个很复杂的数学公式来掷骰子的,不是真的随机——这叫伪随机。"