尧图精选

Python函数return教学:从“礼物”比喻到AI应用

🕒 发布时间:2026/10/1 4:41:26 📁 来源:尧图网络
函数这个话题在少儿编程里其实是个分水岭。前面几节课孩子们还在用现成的函数print、input、len玩得挺开心一旦开始自己定义函数尤其是遇到return课堂气氛立刻就会不一样。有人问return到底把东西返回到哪了有人干脆在函数里写print然后说这不也能用吗。这第15课按照我们课程的节奏刚好到了该认真解决这个问题的时候——而且这次不是单纯讲Python语法是要为后面真正搭建大语言模型应用做铺垫。为什么这么说因为调用大语言模型API时你的代码本质上就是把一段话交给模型函数然后拿回它的返回结果。return理解不到位后面构造工具调用、拼接prompt、处理流式输出都会出问题。这堂课用函数的礼物来比喻return就是想从底层直觉上帮孩子还有陪读的家长把函数能给你东西这件事刻进脑子里。整节课的内容跨度不大但信息密度很高我把课堂实操记录整理成这篇文字版供同样在带零基础学生的朋友参考。1. 为什么前面13节课不敢碰return先让孩子用熟再造心1.1 课程设计思路先学会使唤函数再理解函数回礼很多老师讲return喜欢把它放在函数定义第一节课里教完def马上教return。我的做法相反前14节课里孩子们用各种各样的内置函数用得飞起但完全不用自己定义带返回值的函数。课上我们用len(hello)知道单词长度用range(1,6)生成数字序列用input(请输入你的名字)拿到键盘输入——这些都是一句命令然后天上掉下来一个值。这就是在打地基。孩子先习惯函数是有产出的再回头问这个产出是怎么来的学习动力完全不同。等到第14课结束有孩子拿着len问张老师len是不是偷偷把数字藏在一个盒子里再递给我它的盒子在哪——这就是引入def和return的完美时机。如果我们一上来就讲return孩子脑子里没有调用函数的体验存量只会把return当成一个需要背的规则函数里写一句return东西。至于为什么有些函数写return有些不用写为什么写在中间和写在结尾不一样全靠死记。可一旦先有了十几节课的使用经验再来讲函数内部可以自己做计算做完之后把结果递出来孩子的反应往往是哦原来len里面就藏了一个return。1.2 从盒子里取东西到变量搭好理解return的第一级台阶这一课之前孩子们对变量的理解是盒子里存东西。比如x 3就是往名叫x的盒子里放数字3。但他们还没遇到过盒子里的值是从别的工序中来的。课堂上我是这样过渡的。先在黑板上画一个盒子标着result 3 5问孩子盒子里装的是什么他们都答得很快8。再画第二个盒子标着result len(hello)他们也能说出来5。然后我问第二个盒子里的5是咱们自己算的吗孩子们摇头说不是是len函数算完递给我们的。这就把函数的产出概念搭出来了。接着我问最关键的一步如果咱们自己也想写一个函数工厂工厂做完东西之后怎么把它送到工厂门口有的孩子说放到return快递车上有的说写上return它就自己出去了。不管用什么词认知方向已经对了——函数内部算出来的东西一定要有个递出来的动作这个动作就是今天的礼物return。2. return的本质函数把结果递给你而不是展示给你看2.1 生活类比售货机和打印机到底有什么不一样给孩子讲return最怕用学术语言。什么返回值、调用结果孩子听完就忘。我用两个生活类比打通打印机类比print你点打印打印机咔咔咔吐出一张纸纸上的字你看得见。但纸属于打印机不属于你的程序。打印完程序手里还是空的。售货机类比return你投币按按钮售货机哐当掉出一瓶水那瓶水交到了你手里。之后你想把这瓶水放桌上、喝掉、送人都行——水已经归你了。print就像打印机把字显示在屏幕上就完成任务了return就像售货机把东西实实在在地交到调用者手里调用者可以把它存进变量继续用。这个类比孩子特别容易接受因为手里有没有东西是一种非常直接的体感。2.2 代码里的函数小店一个完整的迷你示例理解了类比之后我让他们自己动手写第一个带return的函数。为了让代码贴近生活我们做了一个加法小店def jia_fa(a, b): result a b return result he jia_fa(3, 5) print(he)运行结果8这里每一行我都要孩子说出它对应的生活动作def jia_fa(a, b):开一个加法小店门口写着请给我两个数。result a b店里的小工开始计算。return result把小工算好的答案装进快递盒递给顾客。he jia_fa(3, 5)顾客拿到快递盒打开一看里面是8把它存进了叫he的盒子里。print(he)我们看看盒子里的值屏幕上显示8。这一串动作走下来孩子们才算真正理解返回值三个字。没有return的函数做出来的东西永远锁在店里顾客空手而归而有了return函数的结果才能被外面的代码接住、存起来、继续加工。2.3 一次看一眼没有return的函数变成什么了为了加深印象我让他们再写一个一模一样的函数但把return result删掉def jia_fa(a, b): result a b he jia_fa(3, 5) print(he)运行结果None孩子看到打印出来的是None全班一下子炸开锅老师小店倒闭了它没把东西递出来我把None翻译成快递盒是空的问他们现在知道售货机不出货是什么感觉了吧。他们点头点得像小鸡啄米。这里特别值得注意函数内部明明算了result a b但因为没有return这个值在外面的变量he里啥也收不到。很多大人学Python也会在这个地方犯迷糊觉得函数里看见了8外面应该也有8。实际上函数内部的变量是本地居民不靠return根本出不了函数的大门。这个认知这堂课必须一次到位不然后面做项目会经常出现函数内部好好的一出来就没值的灵异现象。3. print和return最容易搞混的哥俩现场纠错实录3.1 输出和返回的本质区别广播和握手每次讲return台下必有孩子问print不也能把值弄出来吗为什么非要return课堂上我把print比作班级广播把return比作握手递东西。广播喊一声全班都听到了但广播结束后没有任何人手里多一样东西。你用print在函数里输出计算结果屏幕上确实能看到但程序的其他部分想去接住这个结果手伸过去是空的。握手递东西则刚好相反对方伸手调用函数你的手return把东西递过去对方手里结结实实多了一样东西想怎么处理就怎么处理。这个本质区别决定了print只负责给人看显示完就结束了。return负责交给代码让后面的代码继续用这个值。很多项目里print和return都会并存但作用完全不同。我给孩子的口诀是print是给眼睛看return是给代码用。3.2 学生最爱犯的三个错误原样还原现场这堂课的练习环节我收到了各式各样的错误代码挑三个最有代表性的记录在这里给同样带学生的朋友一个预警。第一个错误把print当return用函数外面接了个寂寞。def shuo_ming(): print(我要去太空) x shuo_ming() print(x)运行结果我要去太空 None孩子看到第一行我要去太空可开心了觉得成功了看到第二行None马上愣住。我让他们对比广播确实播了但递出来的手上是空的。第二个错误return写在print前面后面的print成了永远不执行的废代码。def test(): return 1 print(这句不会打印)运行结果只有1第二行根本没出现。孩子问老师为什么我的print没有被执行这是个特别好的教学契机。return一旦执行函数立刻下班关门后面的代码统统不会跑。很多培训班把这叫return之后的代码是僵尸代码孩子记住僵尸这个词基本就不会再写这种代码了。第三个错误把return和print的位置颠倒了——函数体内先print再return看起来没问题但理解错了return的对象。def jia_fa(a, b): print(a b) return a b he jia_fa(10, 2) print(he是, he)运行结果12 he是 12屏幕上出现了两次12孩子首先会困惑是不是重复了这时候正好解释第一个12是print打印的给眼睛看第二个12是return交给he变量的给代码用。两件事在同一时刻都在发生但它们的目标对象完全不同。3.3 给孩子的纠错话术把抽象错误翻译成生活语言碰到这些错误我一般不用返回值丢失作用域问题这类术语而是用孩子能接住的话来纠错你的函数忘了把手伸出来。忘记写return你的广播很好听但广播完东西还在台上没递到观众手里。只print没returnreturn是下班铃一响后面的代码就不用上班了。return后在函数体内的代码不执行函数门口递出来的东西才算数店里面喊什么外面听不见。局部变量与返回值的关系这些话虽然不那么严谨但孩子的理解速度快得惊人。到了课后小测大部分孩子已经能自己说出print只是喊一声return是把手里的东西递给你。抽象概念一旦有了身体记忆就不容易忘。4. return的变身术多值返回与提前下班4.1 return多个礼物让两个数一起回家讲到这孩子们已经觉得函数手里能递出一样东西很神奇了。我又加了一句那如果函数想递两样东西呢他们愣了几秒有个孩子喊是不是要再长一只手全班笑翻。其实Python对这事特别大方return可以同时递出多个值用逗号隔开就行接收的时候也用逗号隔开。我们课上做了一个分糖果小助手def tang_guo(ke_ren): mei_ren 10 sheng_yu ke_ren * mei_ren % 7 return mei_ren, sheng_yu mei_ren, sheng_yu tang_guo(3) print(每人分, mei_ren, 颗) print(剩下, sheng_yu, 颗)运行结果每人分 10 颗 剩下 2 颗这里我顺便埋了一个伏笔其实return后面跟多个值本质是打包成了一个元组tuple递出来的。但小学生的认知还不需要走那么深只要知道能递多个礼物左边有几个盒子接住就行。等到后面学字典、学拆包再回来看这个写法会轻松很多。4.2 提前return函数也可以半路下班另一个让我没想到的教学点是提前return。设计这节课之前我本来觉得这个知识点对孩子来说会有点绕结果他们接受得出奇快。我用的例子是游乐园入场检查def ru_chang(age): if age 6: return 小朋友太小啦不能玩过山车 return 欢迎入场玩得开心 print(ru_chang(4)) print(ru_chang(10))运行结果小朋友太小啦不能玩过山车 欢迎入场玩得开心孩子一看就懂年龄不到6岁函数当场递出一个拒绝然后就下班了根本不会执行到底部的return。这就是提前return的威力——它让函数可以在不同条件下递出不同的礼物。我再补充了一个函数保护层的概念可以理解为前面的return像门卫拦住了所有不合适的请求后面才是正常流程。以后你在写大语言模型应用的代码时也经常要用这种模式先用return拦截异常输入再放心处理正常输入。4.3 None是什么函数没礼物时递出的空气没有写return的函数运行完会递出None。这个知识点在前面删掉return的例子里已经触发过了。我在课堂上又问了一遍:None是礼物吗?孩子们齐声喊不是那它算不算递东西了他们的理解是递了个空盒子。这个理解非常准。None在Python里代表什么都没有它不是0不是空字符串而是完全不存在的意思。它最常见的出现场景就是函数里没有写return语句或者只写了return后面没跟任何值。def mei_li_wu(): print(我啥也不递出来) result mei_li_wu() print(result)运行结果我啥也不递出来 None我提醒孩子如果有一天你调用自己的函数得到了None第一反应应该去看函数里到底有没有写return而不是怀疑函数算错了。这个排查方向能省很多时间。5. 大语言模型应用里的return从拿到值到会说话的机器人5.1 为什么这个语法要放在大语言模型应用课程里讲可能有朋友会问不就是return吗放在普通Python课里讲不也一样为什么你们这个小学生0基础学大语言模型应用的课还专门拿一整节课来讲它区别在于普通Python课讲完return学生可能只是写写数学题而大语言模型应用课里return是连接代码世界和模型世界的关键桥梁。整个应用的本质循环是写一个函数把一个任务做掉算出结果或者准备好素材。用return把结果递出来。把结果拼进提问大语言模型的prompt里。模型拿到包含现场数据的prompt给出真正有用的回答。你看如果没有return第1步的结果根本走不到第3步大语言模型就只能回答一些正确的废话而无法根据你自己的数据来应答。这在我们后续的项目课——课表助手、英语单词游戏、智能计算器里全部是核心骨架。5.2 实战项目给机器人配一个计算小助手这堂课最后二十分钟我们做了一个迷你项目会算数的机器人。场景是这样的大语言模型本身算数学不擅长尤其多位加减乘除容易算错但我们可以让它调用我们的Python函数来算。def jisuan(a, b, fu_hao): if fu_hao : return a b elif fu_hao -: return a - b elif fu_hao *: return a * b elif fu_hao /: return a / b else: return 我不认识这个符号 # 假设这是从大语言模型那里收到的 用户问题 wen_ben 请计算 12 27 等于多少 # 我们用简单的规则从文本里把数字和符号抠出来实际项目里可以用更聪明的办法 a 12 b 27 fu_hao da_an jisuan(a, b, fu_hao) # 把计算结果作为素材拼进给大语言模型的prompt prompt 请用一句话告诉用户12 27 等于 str(da_an) 。 print(prompt)运行结果请用一句话告诉用户12 27 等于 39。这一步跑通后我让孩子自己把da_an改成jisuan(...)的直接调用也就是不用中间变量直接拼promptprompt 请用一句话告诉用户12 27 等于 str(jisuan(12, 27, )) 。 print(prompt)孩子们立刻就发现了这个jisuan函数像一颗胶囊一按下去返回值自动弹出来塞进字符串里。这不就是函数礼物最生动的应用吗后面真正接入大语言模型API时只需要把这个prompt发给模型模型就会说你好1227等于39哦。孩子的成就感一下就上来了。5.3 升级版用return先过滤垃圾问题我把提前return的知识在这一步顺势做了个升级。假设计算小助手只负责算加法其他的问题直接返回来让大语言模型自己回答def jisuan_jia_fa(wen_ben): if 加 not in wen_ben: return None # 递出空气表示这事儿我不管 # 提取数字的逻辑这里先省略 a 12 b 27 return a b jie_guo jisuan_jia_fa(今天天气怎么样) print(结果是, jie_guo)运行结果结果是 None这里return None扮演的角色非常明确告诉上层代码我搞不定你找别人。上层代码看到None就可以转给大语言模型处理如果看到数字就可以直接拼进回答用。这种分工判断的模式孩子见过两三次后就能模仿以后再写真正的大语言模型工具调用思路就已经通了。6. 课堂上的意外收获孩子问出的return真问题6.1 孩子问return是返回到哪——用一个地址概念来解决每次讲到return总有孩子会举手问老师return返回去回到的是哪里这个问题特别有价值。我用教室的空间来打比方你站在讲台函数外面喊jia_fa(3,5)Python就跑到加法小店函数里面去执行。小店算完result 35把result里的值放进return快递盒。快递盒飞到讲台落到等待它的he变量里——这就叫返回到调用处。也就是说return不是返回屏幕也不是返回到一个神秘空间而是精确地送回函数被调用的那一行。为了验证他们懂了我在黑板上写a 10 b 20 c jia_fa(a, b) 100问他们jia_fa(a,b)的返回值到了哪里。一半孩子答到了c另一半答先跑到100那里算完再放进c。两种答案其实都对后一种更准确。我顺势总结return是一份快递它准确地送到你写调用函数的那一行然后再参与那一行的继续计算。6.2 为什么函数里的快递盒不只一个函数每次被调用都是新开张还有一个孩子问得特别妙如果我调用两次加法小店它是同一个店还是两个店我给他们的答案是函数像一张开店说明书每次调用就是按照说明书新开一个店。每一次开店店里的result都是新的一家互不干扰。代码验证d jia_fa(1, 2) e jia_fa(100, 200) print(d) print(e)运行结果3 300孩子们发现两个调用各自返回各自的值互不干扰彻底理解了函数内部的变量是每次调用独立的这个反直觉的特性。这个理解对后面写复杂机器人项目特别关键。曾经有个学生写了一个聊天机器人在函数里用了一个全局状态变量结果多轮对话后状态乱套而用每次调用都是新开张的眼光去看问题一目了然。6.3 验收游戏谁能写出问一句答一句的复读机函数课堂验收环节我布置了一个小游戏作为exit ticket。要求写一个函数让它的return值随风而来我还要在下一行接住它。def fu_du_ji(question): return question 这是一个问题吗 answer fu_du_ji(你喜欢吃巧克力吗) print(answer)运行结果你喜欢吃巧克力吗这是一个问题吗能独立写出这个函数的孩子说明已经掌握了函数参数进来、函数体处理、return把结果递出、外面接住这整条链路。全班二十八人24人自己写对了剩下4人在看了别人的代码后也调整成功。作为一节围绕单个语法点的课这个掌握率我已经相当满意。下节课第16课我们准备把今天写的复读机函数升级成一个真的会跟大语言模型对话的小机器人——到时候函数return出来的字符串会被拼进发给大语言模型的prompt成为一条完整的对话。每一次return都是一个让代码和模型握手的瞬间。到时候孩子们会发现今天理解的每一个小细节都在新项目里发挥关键作用。教学就是这样一个个基础点看似不起眼串起来就是真正的应用能力。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →