青少年 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 回到行首覆盖上一次显示temprandom.choice(students)print( temp ,end\r)time.sleep(0.08)# 暂停 0.08 秒# 最终结果print()print()resultrandom.choice(students)print( 结果 )print()print( 被点到的同学是「result」)效果屏幕上名字飞快跳动约 1.6 秒最后揭晓结果——全班盯着屏幕气氛拉满。end\r是什么\r是回车符让光标回到本行开头。下一次print会覆盖这一行的内容产生原地刷新的动画效果。4. 版本三不重复点名——每人只点一次版本二有个问题同一个人可能被点两次。版本三加入**“已点集合”**确保公平importrandomimporttime students[张三,李四,王五,赵六,孙七,周八]called[]# 已经被点过的同学print( 不重复点名 )print(输入 q 退出输入 r 重置)print()whileTrue:# 检查是否所有人都被点过iflen(called)len(students):print(所有同学都已经点过了)breakinput(按回车开始点名...)# 从还没被点过的同学中随机选available[]forsinstudents:ifsnotincalled:available.append(s)# 滚动特效foriinrange(20):temprandom.choice(available)print( temp ,end\r)time.sleep(0.08)print()print()# 最终结果resultrandom.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 人# 先打乱顺序shuffledstudents[:]# 复制一份不修改原列表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[张三,李四,王五,赵六,孙七,周八,吴九,郑十,冯一,陈二]groupsmake_groups(students,3)print( 随机分组每组 3 人)print()foriinrange(len(groups)):print( 第str(i1)组、.join(groups[i]))效果 随机分组每组 3 人 第1组王五、冯一、张三 第2组周八、孙七、郑十 第3组赵六、李四、陈二 第4组吴九random.shuffle()直接在原列表上洗牌随机打乱顺序。打乱后按顺序分组自然就是随机分组。6. 完整代码点击展开完整代码含三个模式可直接运行 班级随机点名器 —— 从简单到智能 课堂实用工具 importrandomimporttime# 学生名单 # 使用时把这里改成自己班的学生名字students[张三,李四,王五,赵六,孙七,周八,吴九,郑十,冯一,陈二,褚三,卫四,蒋五,沈六,韩七]# 模式1滚动点名 defroll_call(allow_repeatTrue):滚动点名allow_repeatFalse 时每人只点一次called[]print()print( 滚动点名 )ifnotallow_repeat:print(模式不重复点名每人只被点一次)print(按回车点名输入 r 重置输入 q 退出)print()whileTrue:# 不重复模式下检查是否全部点完available[sforsinstudentsifsnotincalled]ifnotallow_repeatandlen(available)0:print( 所有同学都已点过输入 r 重置 )print()cmdinput( )ifcmdq:breakelifcmdr:called[]print( 已重置所有人都可以重新被点到。)print()continuepoolavailableifnotallow_repeatelsestudents# 滚动特效foriinrange(22):temprandom.choice(pool)print( temp ,end\r)time.sleep(0.06i*0.005)# 越滚越慢print()print()resultrandom.choice(pool)print( [结果] 「result」)ifnotallow_repeat:called.append(result)leftlen(students)-len(called)print( 还剩 str(left) 人未点到)print()# 模式2随机分组 defgroup_mode():print()print( 随机分组 )sizeint(input(每组几人))ifsize0:print( 每组至少 1 人)returnshuffledstudents[:]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(i1)组str(len(groups[i]))人、.join(groups[i]))print()# 模式3快速点名无滚动 defquick_pick():print()print( 快速点名 )timesint(input(一次点几人))print()foriinrange(times):resultrandom.choice(students)print( str(i1). result)print()# 模式4管理名单 defmanage_list():globalstudentsprint()print( 管理名单当前 str(len(students)) 人)print()foriinrange(len(students)):print( str(i1). students[i])print()print( 1.添加 2.删除 3.返回)cinput( )ifc1:nameinput( 姓名)students.append(name)print( 已添加name)elifc2:numint(input( 删除第几个))if1numlen(students):removedstudents.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()cinput( 请选择)ifc0:breakelifc1:roll_call(allow_repeatTrue)elifc2:roll_call(allow_repeatFalse)elifc3:quick_pick()elifc4:group_mode()elifc5:manage_list()else:print( 输入有误~)main()7. 教学指南课堂节奏60 分钟时间内容形式0~3 min老师运行完整版点几个学生名字——全班注意力瞬间集中演示3~10 min版本一3 行代码写出第一个点名器学生跟打10~20 min版本二加入滚动特效\rtime.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入门#课堂工具#随机点名#少儿编程#教培