青少年 Python 入门 | 课堂实战——「班级随机点名器」从简单到智能
青少年 Python 入门 | 课堂实战——「班级随机点名器」从简单到智能
适合人群:Python 入门(建议 5~8 年级),学完
list和random后的项目
项目定位:单课时(60 分钟),成品是老师上课能用的点名工具
教学目标:list增删改查、random.choice/random.shuffle、防重复机制、time.sleep滚动效果
目录
- 课堂的真实需求
- 版本一:最简单的点名器——3 行代码
- 版本二:滚动特效——像抽奖一样刺激
- 版本三:不重复点名——每人只点一次
- 版本四:分组模式——随机分小组
- 完整代码
- 教学指南
1. 课堂的真实需求
编程课最难的是什么?不是语法,是让学生觉得"这东西有用"。
这个项目有一个天然的优势:写完当场就能用。老师运行学生写的代码来点名回答问题,全班看着名字在屏幕上滚动——“千万不要点到我!”
更妙的是,这个项目有四个版本,层层递进,每个版本只加一点点新知识,但体验完全不同。
2. 版本一:最简单的点名器——3 行代码
importrandom students=["张三","李四","王五","赵六","孙七","周八"]print("被点到的同学是:"+random.choice(students))三行代码,已经能用了。这就是最小可行产品——先跑起来,再变好。
关键教学点:
random.choice(列表)从列表中随机取一个元素。让学生把students换成自己班的名字,立刻就能用。
3. 版本二:滚动特效——像抽奖一样刺激
版本一太快了,没有悬念。版本二加入滚动效果:名字在屏幕上快速跳动,几秒后慢慢停下来。
importrandomimporttime students=["张三","李四","王五","赵六","孙七","周八"]print("===== 随机点名 =====")print()# 滚动阶段:快速切换 20 次foriinrange(20):# 随机显示一个名字(用 \r 回到行首覆盖上一次显示)temp=random.choice(students)print(" >>> "+temp+" <<<",end="\r")time.sleep(0.08)# 暂停 0.08 秒# 最终结果print()print()result=random.choice(students)print("===== 结果 =====")print()print(" 被点到的同学是:「"+result+"」")效果:屏幕上名字飞快跳动约 1.6 秒,最后揭晓结果——全班盯着屏幕,气氛拉满。
end="\r"是什么:\r是"回车符",让光标回到本行开头。下一次
4. 版本三:不重复点名——每人只点一次
版本二有个问题:同一个人可能被点两次。版本三加入**“已点集合”**,确保公平:
importrandomimporttime students=["张三","李四","王五","赵六","孙七","周八"]called=[]# 已经被点过的同学print("===== 不重复点名 =====")print("输入 'q' 退出,输入 'r' 重置")print()whileTrue:# 检查是否所有人都被点过iflen(called)>=len(students):print("所有同学都已经点过了!")breakinput("按回车开始点名...")# 从还没被点过的同学中随机选available=[]forsinstudents:ifsnotincalled:available.append(s)# 滚动特效foriinrange(20):temp=random.choice(available)print(" >>> "+temp+" <<<",end="\r")time.sleep(0.08)print()print()# 最终结果result=random.choice(available)print(" 被点到的同学是:「"+result+"」")# 加入已点名单called.append(result)print(" 还剩 "+str(len(students)-len(called))+" 人未被点到")print()核心算法:
available = [s for s in students if s not in called]
这叫"过滤"——从总名单中筛掉已经出现过的。用自然语言说:把还没被点过的同学放进一个新篮子。
5. 版本四:分组模式——随机分小组
期末做项目汇报、课堂讨论都需要分组。版本四增加分组功能:
importrandomdefmake_groups(students,group_size):"""将学生随机分成若干小组,每组 group_size 人"""# 先打乱顺序shuffled=students[:]# 复制一份,不修改原列表random.shuffle(shuffled)groups=[]current_group=[]forsinshuffled:current_group.append(s)iflen(current_group)>=group_size:groups.append(current_group)current_group=[]# 剩下的不足一组也加入iflen(current_group)>0:groups.append(current_group)returngroups# 使用students=["张三","李四","王五","赵六","孙七","周八","吴九","郑十","冯一","陈二"]groups=make_groups(students,3)print("===== 随机分组(每组 3 人)=====")print()foriinrange(len(groups)):print(" 第"+str(i+1)+"组:"+"、".join(groups[i]))效果:
===== 随机分组(每组 3 人)===== 第1组:王五、冯一、张三 第2组:周八、孙七、郑十 第3组:赵六、李四、陈二 第4组:吴九
random.shuffle():直接在原列表上"洗牌",随机打乱顺序。打乱后按顺序分组,自然就是随机分组。
6. 完整代码
点击展开完整代码(含三个模式,可直接运行)""" 班级随机点名器 —— 从简单到智能 课堂实用工具 """importrandomimporttime# ==================== 学生名单 ====================# 使用时把这里改成自己班的学生名字students=["张三","李四","王五","赵六","孙七","周八","吴九","郑十","冯一","陈二","褚三","卫四","蒋五","沈六","韩七"]# ==================== 模式1:滚动点名 ====================defroll_call(allow_repeat=True):"""滚动点名,allow_repeat=False 时每人只点一次"""called=[]print()print("===== 滚动点名 =====")ifnotallow_repeat:print("模式:不重复点名(每人只被点一次)")print("按回车点名,输入 r 重置,输入 q 退出")print()whileTrue:# 不重复模式下检查是否全部点完available=[sforsinstudentsifsnotincalled]ifnotallow_repeatandlen(available)==0:print(">>> 所有同学都已点过!输入 r 重置 <<<")print()cmd=input("> ")ifcmd=="q":breakelifcmd=="r":called=[]print(" 已重置!所有人都可以重新被点到。")print()continuepool=availableifnotallow_repeatelsestudents# 滚动特效foriinrange(22):temp=random.choice(pool)print(" >>> "+temp+" <<<",end="\r")time.sleep(0.06+i*0.005)# 越滚越慢print()print()result=random.choice(pool)print(" [结果] 「"+result+"」")ifnotallow_repeat:called.append(result)left=len(students)-len(called)print(" (还剩 "+str(left)+" 人未点到)")print()# ==================== 模式2:随机分组 ====================defgroup_mode():print()print("===== 随机分组 =====")size=int(input("每组几人?"))ifsize<=0:print(" 每组至少 1 人!")returnshuffled=students[:]random.shuffle(shuffled)groups=[]current=[]forsinshuffled:current.append(s)iflen(current)>=size:groups.append(current)current=[]iflen(current)>0:groups.append(current)print()foriinrange(len(groups)):print(" 第"+str(i+1)+"组("+str(len(groups[i]))+"人):"+"、".join(groups[i]))print()# ==================== 模式3:快速点名(无滚动) ====================defquick_pick():print()print("===== 快速点名 =====")times=int(input("一次点几人?"))print()foriinrange(times):result=random.choice(students)print(" "+str(i+1)+". "+result)print()# ==================== 模式4:管理名单 ====================defmanage_list():globalstudentsprint()print("===== 管理名单(当前 "+str(len(students))+" 人)=====")print()foriinrange(len(students)):print(" "+str(i+1)+". "+students[i])print()print(" 1.添加 2.删除 3.返回")c=input(" > ")ifc=="1":name=input(" 姓名:")students.append(name)print(" 已添加:"+name)elifc=="2":num=int(input(" 删除第几个?"))if1<=num<=len(students):removed=students.pop(num-1)print(" 已删除:"+removed)else:return# ==================== 主菜单 ====================defmain():print()print(" +-------------------------------------+")print(" | 随 机 点 名 器 |")print(" | Classroom Picker |")print(" +-------------------------------------+")whileTrue:print()print(" 1. 滚动点名(可重复)")print(" 2. 滚动点名(不重复)")print(" 3. 快速点名(一次点多人)")print(" 4. 随机分组")print(" 5. 管理名单")print(" 0. 退出")print()c=input(" 请选择:")ifc=="0":breakelifc=="1":roll_call(allow_repeat=True)elifc=="2":roll_call(allow_repeat=False)elifc=="3":quick_pick()elifc=="4":group_mode()elifc=="5":manage_list()else:print(" 输入有误~")main()7. 教学指南
课堂节奏(60 分钟)
| 时间 | 内容 | 形式 |
|---|---|---|
| 0~3 min | 老师运行完整版,点几个学生名字——全班注意力瞬间集中 | 演示 |
| 3~10 min | 版本一:3 行代码写出第一个点名器 | 学生跟打 |
| 10~20 min | 版本二:加入滚动特效\r+time.sleep | 讲解 + 跟打 |
| 20~30 min | 版本三:不重复机制——"可用名单"过滤 | 学生独立 |
| 30~45 min | 版本四:分组算法shuffle+ 切片 | 讲解 + 学生独立 |
| 45~55 min | 完善菜单 + 名单管理功能 | 自由创作 |
| 55~60 min | 实战:用学生自己写的程序现场点人 | 全班互动 |
教学技巧
- 名单即动力:让学生把自己班的名字打进去,甚至把老师的名字也放进去——“连老师一起点”
- 故意制造 bug 讲概念:版本一重复点到同一个人,问学生"这公平吗?"引出防重复的需求
\r是个魔术:在黑板上演示"先写 ABC,回到行首写 DEF,结果是 DEF",理解覆盖原理- 让代码进真实课堂:后面几节课的点名环节,就用学生自己写的程序。这是一劳永逸的成就感
课后挑战
| 难度 | 任务 | 技能 |
|---|---|---|
| 1星 | 把名单改成自己班的实际名单 | 列表编辑 |
| 2星 | 增加"加权点名"——某人被点过的概率降低 | 概率调节 |
| 3星 | 把点名记录保存到文件(日期+被点者) | open+ 日期 |
| 4星 | 用 Turtle 做转盘动画 + 图片头像 | Turtle + 三角函数 |
| 5星 | 接入语音播报——点名后用pyttsx3读出名字 | 第三方库 |
评论区:你的学生第一次看到自己写的点名器在课堂上运行时,是什么反应?
Python 3.6+ 直接运行 | 无需第三方库 | 课堂即刻可用
标签:#青少年编程#Python入门#课堂工具#随机点名#少儿编程#教培
