Python少儿编程:运算符详解与口算题项目实战
这个系列录到第 4 课正好卡在一个有趣的节点上前面几课孩子已经学会了print输出、认识了变量能写出一些“会说话”的程序了但距离“会用程序解决问题”还差一大截。很多孩子在这个阶段会觉得编程不过是个打字游戏把代码敲出来跑一下屏幕冒几行字完事了。真正让他们觉得“程序有点东西”的恰恰是这一课——让程序自己算数。我课上第一句话常问孩子“心算一道 38×27你们要多久”孩子们摇摇头然后我接着说“今天开始你们写出来的程序一秒钟能算完而且永远不会算错。”这可比print(Hello World)有冲击力得多。所以这一课的核心不是教孩子“认识运算符符号”而是帮他们建立“程序是计算工具”的底层认知知道怎么写、为什么这么写、算出来的结果怎么用。这篇文章把我在课堂上完整讲下来的思路、示例、以及孩子们最容易踩的坑整理出来给准备带娃入门或者自己刚学 Python 的朋友做份参考。1. 算术运算符第一套“算数工具箱”1.1 加减乘与除法编程语言里的 4 个“老熟人”Python 里的算术运算符最先要认识的 5 个符号一个都不陌生、-、*、/。小学生从一年级就开始用它们唯一需要适应的是“乘号”从×变成了*“除号”从÷变成了/。讲清楚这个转变孩子的心理门槛能降一大半。我通常会先在屏幕上投影一段直观的代码让孩子猜输出结果a 12 b 5 print(a b) # 加法 print(a - b) # 减法 print(a * b) # 乘法 print(a / b) # 除法孩子们看到前三行的输出基本都能立刻答对17、7、60一看到12 / 5的结果教室里的反应就开始热闹了。2.4这个答案好多孩子没想到因为他们在数学课上接触的除法要么是整除、要么是余数很少直接输出小数。这里正好可以强调一个关键点在 Python 里用单个/做除法得到的一定是浮点数也就是小数哪怕两个数刚好能整除比如10 / 2结果也会是5.0而不是5。大多数第一次接触 Python 的孩子并不会觉得这算什么大事但到了后面写数值计算、数据处理时整数和小数的类型差异会反复出现。所以在这里提前铺一个“类型”的种子int是整数float是带小数点的数5和5.0看起来差不多在程序内部的“身份”不一样。1.2 整除//和取余%除法的两个“特殊分身”小学三四年级学有余数除法时孩子都做过这种题17 ÷ 5 3余2。Python 非常贴心地给了两个运算符一个专门拿商一个专门拿余数print(17 // 5) # 结果 3只要商不要余数 print(17 % 5) # 结果 2只要余数不要商这一组是课堂上最容易讲出趣味性的内容因为生活中“整除和取余”的例子特别多。比如分糖果班级有 30 颗糖平均分给 4 个小朋友每个小朋友能拿几颗还剩几颗代码一句话就能算清楚total 30 kids 4 each total // kids left total % kids print(each) # 7 print(left) # 2我还会提醒孩子一个容易搞混的细节//是“向下取整”的整除它并不是简单地“把小数点后面的尾巴砍掉”。比如-7 // 2算出来是-4而不是-3。初学阶段正数场景占绝大多数这个细节不用讲太深但至少得让孩子知道“取整”不等于“丢掉小数”不然以后碰到负数会一脸懵。%取余还有个很实用的用途判断奇偶。任何整数如果除以 2 的余数是 0那它就是偶数余数是 1就是奇数。后面写到“偶数求和”“隔行变色”这类程序时% 2几乎是出镜率最高的写法。1.3 幂运算**比计算器更顺手的神奇符号除了加减乘除还有一个很常用但很多人不知道的运算符**它代表“幂运算”也就是数学里的“几次方”。写2 ** 3代码会说这是“2 的 3 次方”结果是 8。课堂上我喜欢拿计算器做对比想算2^10多数计算器要先按一个^键甚至用移位键而在代码里直接写print(2 ** 10) # 1024一句话的事。很多孩子第一次感受到“代码比计算器好用”就是从这种地方来的。幂运算不是必须在这一课全部掌握的内容但提前认识能让他们在写“计算正方形面积”“算复利”之类题目的时候思路顺很多。除了这 6 个符号Python 里还有一个求绝对值的函数abs()不过它属于函数而非运算符我到后面讲函数时才会展开。这一阶段先把四则运算、整除、取余、幂四类工具用熟后面的所有计算场景基本都能应付了。2. 赋值运算符把结果“存进盒子”的动作2.1 一个等号不是“等于”是“投递”动作这一课最大的思维转变是让孩子理解数学里的表示“两边相等”但编程里的是一个“动作”——把右边的值装进左边的变量里。我在白板上画一个带盖子的纸箱左边写box右边写42再画一个箭头从42指向box告诉孩子“程序执行box 42的时候相当于把手里的 42 塞进名叫 box 的盒子里。”这个比喻对 8 岁左右的孩子特别管用他们一下子就能理解“变量是容器”这件事。也因此下面两行代码在数学上是荒谬的但在编程里完全正常x 10 x x 1我会故意问孩子第二行是不是“x 等于 x 加 1”数学课上从没见过这种等式吧他们会笑然后我再解释先看右边的x 1此时x是 10算出 11再把 11 装回x这个盒子里于是盒子里原来的 10 被新的 11 覆盖。程序的执行顺序是“先算右边再存左边”这个顺序意识非常关键后面学算法时天天要用。2.2 复合赋值缩短写法的“隐藏逻辑”“把变量更新一下”这个需求太常见了所以 Python 提供了一组偷懒写法叫复合赋值运算符、-、*、/、//、%、**。我先展示最原始的写法score 0 score score 10然后告诉孩子Python 觉得这样写太长给了个简写版本score 0 score 10这两段代码的效果完全一样。初次看到的孩子往往有点懵但只要把这个等式翻译成“score 自己给自己加 10”他们马上能接受。我还会强调一个容易出错的点、-这些符号中间不能有空格写作 会直接报语法错误很多刚打完代码的孩子都会栽在这个小细节上。复合赋值运算符的本质不是“省几个字母而已”而是要让孩子体会到程序里的变量是“可变的”它可以一次次被更新。这种“更新变量”的思维方式和初学数学时“x 一旦确定就固定不变”的直觉截然不同越早扭转后面理解循环、累加器越轻松。2.3 用做一个简单的计分装置为了让孩子真正明白“更新变量”比“认识符号”更重要我会让他们现场做一个小程序模拟答题得分。score 0 score 10 # 答对第 1 题 score 10 # 答对第 2 题 score 5 # 答对第 3 题附加题少一点 print(score) # 25孩子盯着代码一行行看能非常直观地看到 score 怎么变0 变成 10、变成 20、变成 25。我会当场提问“如果不小心写了score score 10和score 10有什么区别”训练他们掌握两种写法互换的能力。后面第 5 课进入循环时这种“变量不断累加”的代码会批量出现现在练得越熟后面越不慌。3. 比较运算符程序第一次学会“判断对错”3.1 输出 True/False 的六把尺子如果说算术运算符是让程序“动手”比较运算符就是让程序“动脑”。Python 里的比较运算符一共 6 个大于、小于、大于等于、小于等于、等于、!不等于。这一块的难点不在于理解符号含义——孩子在数学课上早就认识它们了而在于理解“一次比较运算会产生一个值这个值只有两种可能True 或 False”。在 Python 里True和False也是数据它们有个专门的类型叫布尔类型英文写作bool。我上课时会在黑板上贴 6 张卡片每张写一个运算符接着随机抽两个孩子报出他们的年龄然后让孩子在代码里比较age1 9 age2 11 print(age1 age2) # False print(age1 age2) # True print(age1 9) # True print(age2 10) # False print(age1 age2) # False print(age1 ! age2) # True孩子看到程序输出True或False会觉得“程序像在回答判断题”。我会趁机点破一个本质程序之所以能实现“判断”“分支”“条件”幕后靠的全部是这些 True/False 结果。没有比较运算符后面的if语句完全无法开工。3.2与的世纪大混淆写比较运算符时孩子甚至成年人最常犯的错误就是把“判断是否相等”写成“赋值”。我刚当老师那会儿也觉得这个问题说一遍就行了结果发现平均每节课都有三五个孩子会写出if x 5这种代码。Python 会报语法错误会阻止程序跑下去但这依然阻挡不了大家手滑。针对这个问题我总结了一句给孩子的话“单个是‘把东西装进盒子’双个是‘检查两边一不一样’。”最多课程时间可以用 5 分钟专门做小测试给一组代码让孩子判断对错比如a 3 # 对的这是赋值 b 3 # 没有报错但这一行毫无意义因为它只判断不存储一个很有意思的点是单独写一行b 3是合法的程序不报错也不输出任何东西。初学孩子写比较时经常漏掉print然后跑来问“老师我的程序为什么没反应”其实就是这个原因。我会让他们养成一个习惯写完比较运算符先想“我要不要把结果打印出来或者存到一个变量里”。4. 逻辑运算符把零散条件拼成“综合推理题”4.1 and、or、not 如何跟现实生活对应逻辑运算符一共三个and、or、not。它们接收的是 True/False 的值产出的还是 True/False 的值。讲这一部分我会完全脱离代码先让孩子用自然语言做判断“今天下雨and我带了伞”——两件事都成立我才不会淋湿。“我吃了早饭or我带了面包”——只要有一件事成立我就不饿。“not停电”——就是“没停电”。这些话孩子天天都在经历所以理解 and 是“两个都要满足”、or 是“满足一个就行”、not 是“反着来”几乎没有障碍。然后我再把这些口语翻译成 Pythonis_raining True has_umbrella False print(is_raining and has_umbrella) # False下雨了但没带伞会淋湿 print(is_raining or has_umbrella) # True下雨或者带伞至少满足一个 print(not is_raining) # False不是“没下雨”顺着这个思路我会让他们自己造句写代码。有孩子写“写完作业 and 做完家务才能看电视”有孩子写“妈妈开心 or 爸爸开心就能出去玩”。当孩子能把代码里的布尔表达式翻译回自己的生活逻辑说明他们真的理解了。逻辑运算的结果可以存进变量也可以组合进复杂表达式。注意不能像数学里那样连写50 x 80之外的复杂用法可以先放一放但至少得明确Python 支持连写比较比如60 score 100是可以直接判断分数是否及格的这样代码读起来几乎就是一句英文。4.2 用逻辑运算符做一个“闯关小判断”我设计了一个特别能活跃气氛的课堂练习模拟游戏角色能否进入下一关。hp 30 # 角色血量 has_key True # 是否拿到了钥匙 level 3 # 当前关卡 # 过关条件血量大于 0并且拿到钥匙或者关卡小于第 4 关 result hp 0 and (has_key or level 4) print(result) # True这个例子里既有比较运算符又有逻辑运算符还有一个括号。我会让孩子们先自己心算一遍再上机跑。大多数孩子能算出最终结果是True但要说清楚“为什么先算括号里的”正好可以引出下一章优先级的内容。5. 运算符优先级先算谁后算谁规则和数学课一样5.1 从“先乘除后加减”说起小学二年级就学过的运算顺序放到编程里完全适用先算乘除再算加减括号优先同级从左到右。我直接用一道题验证孩子的记忆result 2 3 * 4 print(result)我敢打赌班上一个班至少有三分之一的孩子会兴冲冲地报 20。因为人脑读算式时天然倾向“从左往右”而程序的运算顺序是“先乘除、后加减”。正确答案是 14。让孩子亲眼看到“自己算错了程序却坚持规则”他们对运算符优先级这件事的记忆会比任何口诀都深刻。Python 完整的运算符优先级比数学复杂得多算术运算本身就分好几个层次。初学阶段我只需要孩子记住四句话括号最优先**幂运算紧跟在括号后接着是*、/、//、%这些乘除级运算然后是、-加减级运算。没必要一次把位运算、比较运算、逻辑运算的全套优先级都背下来因为实际写代码时最稳妥的习惯是“拿不准就加括号”。编程不是考试不需要把所有优先级背得滚瓜烂熟保证代码意图清晰才是最重要的。5.2 括号是人类和程序沟通的“安全气囊”我反复给孩子们强调加括号不是“认输”而是“为了让别人读你的代码时不用猜你的心思”。看下面两个表达式a 2 3 * 4 # 结果 14 b (2 3) * 4 # 结果 20两个写法都合法但意思是不同的。在团队协作中代码是给人读的也是给机器跑的。多用括号能让阅读代码的人快速抓住核心计算意图。而且 Python 里即使多加了几层括号只要括号语法正确完全不影响性能给的“安全垫”足够厚。上课时我还会带出一个概念优先级越高越先执行。**比负号、乘除都优先。比如-3 ** 2结果是-9而不是9因为程序先算3 ** 2再取负号。这个细节很反直觉如果孩子以后碰上把(-3) ** 2写清楚就不至于误解了。6. 实战项目让程序自己出 20 道口算题6.1 项目拆解需求清单这一课最后端上桌的“硬菜”是一个口算测验小程序。需求我一般这样给孩子描述程序随机出 20 道“两位数加一位数”的口算题你输入答案最后程序报总分。这个程序小、好玩、能反复玩一旦跑通孩子成就感爆炸。写代码前我先带着拆需求程序需要“随机”出题题目是算式比如34 7 需要接收用户输入的数字需要判断答案对不对需要记录分数最后输出总分。这份清单直接对应了本课所有内容随机数是新知识其他全是刚学的算术、比较、逻辑、输入输出。拆需求这件事本身就是编程思维训练的一部分。6.2 完整代码与运行逻辑import random score 0 for i in range(5): # 先做 5 题方便课上演示 num1 random.randint(20, 90) num2 random.randint(1, 9) answer num1 num2 user int(input(f第{i1}题{num1} {num2} )) if user answer: print(答对了) score 10 else: print(f答错了正确答案是 {answer}) print(答题结束你的得分是, score)代码里出现了几个还没正式讲的新东西但孩子都能“猜到意思”random是 Python 自带的随机模块要先用import引入random.randint(20, 90)表示随机生成一个 20 到 90 之间的整数for i in range(5)表示重复 5 次。这些细节我前几课大多讲过或铺垫过就算没讲透第 4 课直接以“工具用法”的形式介绍也很自然。运行效果大致是第1题52 7 59 答对了 第2题48 9 53 答错了正确答案是 57 第3题73 4 77 答对了 第4题31 8 36 答错了正确答案是 39 第5题66 5 71 答对了 答题结束你的得分是 30调试的时候提醒孩子两点一是input()拿到的是字符串必须用int()包一层否则拿它和整数answer比较时会类型不匹配二是input里的提示语要写清楚尽量让孩子看一眼就知道该输入什么。6.3 课后扩展改改就能玩出新花样我觉得这节课最大的成功标准是孩子跑完以后觉得“不够我还想改”。课后扩展我给三档难度简单把改成-注意保证结果不为负中等随机生成加减乘除四种题目挑战完整四则运算进阶用%出“判断奇偶”的题或者出“几乘以几再加几”的综合算式考验运算优先级。每档都有对应的代码改动思路。能独立完成中等档的孩子基本上已经把这一课吃透了。7. 课堂避坑孩子最容易踩的三个“运算符陷阱”7.1 坑一字符串和数字用拼在一起程序炸给你看第一课学print的时候我们习惯写print(我的年龄是 9)看上去很自然但 Python 会直接报TypeError: can only concatenate str。原因是字符串和整数不能直接用拼接。解决办法两种一是用逗号隔开print(我的年龄是, 9)二是把数字转成字符串print(我的年龄是 str(9))。这个坑几乎每届学生都会踩所以我干脆把它当成一个“故意制造错误”的演示环节让孩子亲眼看到报错长什么样再一起修复。让孩子知道“报错不可怕读懂报错才是真本事”比单纯让他们抄正确答案更有价值。7.2 坑二整除和取余用反了写分糖果的程序时有孩子会把each total // kids写成each total % kids最后每人分到 2 颗、还剩 7 颗逻辑完全颠倒。这种错误不是不会算余数而是对“两个运算各解决什么问题”没有建立起稳定的直觉。我的纠正办法是让孩子养成一个习惯看到“平均分”想//看到“还剩几个”想%。在真实世界里除法的两个结果都是信息一个应用场景要找全。比如行程规划从家到学校 700 米一步走 0.6 米要走多少步最后多余的 0.4 米怎么忽略这种带单位的问题比纯数字题目更能帮孩子建立直觉。7.3 坑三优先级视而不见拆括号靠“猜”还有一种错误是孩子写长表达式时不加括号还坚信“从上往下算”。比如口算测验里有孩子写score score 10 if user answer else score这是我一时兴起的示例实际课堂我还真见孩子这么玩过。这种写法不是不行但低年级孩子一旦思路被三元表达式绕进去后面改逻辑就很麻烦。我更推荐写清楚if user answer: score 10每一行表达一个意思读起来清清楚楚。初学阶段代码风格应当优先服务“可读性”而不是“简洁性”。要不要“秀操作”等技术熟练之后再考虑那时他们自然会发现很多东西可以简化。从第 4 课往后程序就越来越像个“真正的工具”了能输入、能计算、能判断、能反馈。这一切的基石就是本文讲的这些“让人看起来觉得太简单”的运算符。我个人的教学体会是这一课宁可讲慢一点让孩子亲手把这些运算符一个个跑一遍、改一遍、故意弄出几个错再修好也比追求进度让他们只记住符号有效率得多。下次孩子跟你们说“学编程就是敲代码”的时候不妨让他们写一个自己心里的口算小系统感受下“程序替自己算题”的乐趣。