
上个周末上课讲到《小学生0基础学大语言模型应用》第15课主题是“函数的礼物return”。课前我还有点担心“返回值”这个概念对零基础的孩子来说会不会太抽象结果一节课下来孩子们不仅没被绕晕反而自己写出了能回答问题的“魔法问答机”。有个小朋友在下课的时候拉着我说老师return就像函数把礼物递到我手里我打开才知道里面是什么那一刻我就知道这节课的思路对了。这篇文章就是第15课的完整复盘。如果你也在带着孩子学Python或者自己想重新理解一下“函数”和“return”这两个基础概念这节内容可以给你一些真正能上手的启发。大语言模型也好普通的Python程序也好底层都是无数个函数在互相调用而return就是函数之间传送结果的那只手。理解了return你就打通了“调用函数→拿到结果→继续处理”这条主链路。1. 先拆掉一个心魔函数到底是什么1.1 把函数想象成一台自动售货机很多孩子包括一些大人一听到“函数”两个字就紧张觉得那是数学书上f(x)那样的吓人东西。其实在编程里函数就是一个“装好了步骤的小盒子”。我给孩子们打了一个比方函数就像一台自动售货机。你投进去硬币按下编号这叫参数机器内部吭哧吭哧运转这叫执行代码最后“哐当”一声掉出来一瓶饮料这叫返回值。全程你不需要知道机器内部怎么制冷、怎么识别硬币你只需要知道投币、按按钮、拿饮料。这就是函数的意义——把复杂的过程打包用的时候只需要调用不用每次重新写一遍细节。举个例子print(你好)里面print就是一个函数。你不需要知道它是怎么把文字送到屏幕上的你只要把想要显示的“内容”递给它它就会帮你显示出来。len(hello)也是函数它帮你数出字符串里有几个字符把数字5送回来。孩子们其实早就用过函数了只是不知道它们的名字而已。1.2 函数最重要的三块拼图一个完整的函数由三块拼图组成输入、处理、输出。输入通过参数传递进来的数据就像自动售货机接收的硬币和编号。处理函数内部执行的一堆语句这是它“干活”的过程。输出把处理完的结果交给调用者这就是return做的事。用代码来看最简单的函数长这样def jiafa(a, b): result a b return result这里def是“定义define”的缩写后面的jiafa是函数的名字括号里的a和b是参数函数体内部计算a加b最后用return把结果送出去。调用的时候这样写answer jiafa(3, 5) print(answer) # 显示 8变量answer接住了函数“递出来的礼物”也就是计算的结果8。没有return的话你虽然算出了8但这个8只会闷在函数内部外面的人根本拿不到。这就像自动售货机把饮料准备好了却不往外送——你说气不气人。1.3 为什么大语言模型应用里全是函数这一节课的系列主题是大语言模型应用孩子们就问了老师和函数有什么关系关系太大了。你用各种方式访问大语言模型的时候本质上就是调用了别人写好的一堆函数。发送提问、接收回复、解析结果每一步背后都是函数在忙碌。比如你在某个聊天网页里输入一句话网页代码会调用一个“发送请求”的函数这个函数把问题带到服务器服务器又调用大语言模型的核心函数进行推理推理出的文本被包裹在一个结果对象里再通过一个“获取返回内容”的函数交还给你。整个过程一层套一层如果你不理解 return就没法理解为什么上一层的函数能拿到下一层的结果。所以我说函数不是大语言模型的“额外知识”而是理解大语言模型应用的关键地基。把函数学扎实了后面再看聊天机器人的代码、看处理返回结果的操作都会轻松很多。2. return函数送出的那份“回礼”2.1 没有return的函数像只干活不吭声的人我让孩子们做了个小实验。课堂上先运行了这样两段代码让他们观察区别。def fengle_1(): print(我把礼物准备好了) def fengle_2(): print(我把礼物准备好了) return 这是给你的礼物表面上调用fengle_1()和fengle_2()的时候屏幕都会显示一句话。孩子们立刻说“看起来一样啊都打印了一行字。”但我又追问了一句如果我想把里面的“礼物”存起来下次再用呢gift1 fengle_1() gift2 fengle_2() print(gift1) # 显示 None print(gift2) # 显示 这是给你的礼物gift1是Nonegift2是那行字。这就是关键差别没有return的函数虽然内部做了一些事打印了文字但没有把结果真正“交出来”有return的函数除了做事还会把结果交到调用者的手上让调用者可以保存、传给别的函数、或者继续加工。我给孩子们总结了一句口诀print是“把话说给你听”return是“把东西递到你手里”。前者只是显示后者才是真正的交接。2.2 return的三重身份第一重身份停止执行。return一旦执行函数后面的所有代码都不会再跑了。我用一个例子说明def fenpei(score): if score 60: return 及格了 return 还要加油如果分数是80函数运行到return 及格了就立刻停下来后面的return 还要加油根本不会执行。第二重身份送出结果。return后面跟着的那个值就是函数要交出来的礼物。第三重身份把结果交给调用者。调用者可以用一个变量接住这个结果这是最重要的一个身份。没有这一层函数计算结果再多也传不出来。2.3 一份礼物还是多份礼物有孩子问一个return只能送一份礼物吗其实你可以送一份“打包好的大礼包”。Python里用元组或者列表就能一次返回多个值def suibian(): name 小明 age 10 return name, age n, a suibian() print(n, a)这里return name, age实际上返回的是一个元组外面用n, a两个变量分别接住。孩子可以理解成把两份小礼物装进了一个大口袋里递出来外面的人接住口袋再拆开。这种写法在处理大语言模型返回结果时很常用比如同时返回“回答内容”和“状态码”。2.4 return和print一个表格说清楚对比项returnprint作用把结果交还给调用者在屏幕上显示文字函数能不能继续函数立即终止函数继续执行后面代码结果能被保存吗能被变量接住并使用不能被变量接住大语言模型场景把模型回复传给主程序把消息显示给用户看很多初学者就是被这两个概念搞混做题或者写程序的时候总觉得print出来了结果就在了。实际不是这样。你print一万遍外面的变量也接不到任何东西你return一次外面就能反复使用这个结果。3. 大语言模型应用里return长什么样3.1 模拟一个“智能小助手”的核心函数既然是“大语言模型应用”系列课程这一节我不光讲语法还要把return放进真实的“小助手”程序里去。我给孩子们设计了一个场景我们要做一个帮人“查天气”的小助理它会根据你输入的城市名返回一句提示语。但孩子们还不会真的调用大语言模型接口所以我做了一个“模拟版本”——用字典当一个小数据库函数负责查数据并返回结果def tianqi(city): data { 北京: 晴25度, 上海: 多云28度, 深圳: 阵雨30度, } if city in data: return f{city}今天的天气{data[city]} return 抱歉我还没有这个城市的天气数据这个函数就一个参数city内部查询字典查到了就返回一条“天气播报”查不到就返回一句抱歉。关键点在于两个return形成了两种出口调用者可以根据拿到的结果做不同处理msg tianqi(北京) print(msg)这里msg里装的就是函数返回的那句话接下来你想把它存进文件、拼接到别的内容里都随你。这就是大语言模型应用的基础模式收到提问返回回答。3.2 让函数学会“挑关键词”返回答案进一步地我给孩子们演示了一个更像“大语言模型”简化版的函数它接收用户的问题看看问题里有没有出现“你好”“名字”“天气”“再见”等关键词然后返回对应的回答。def xiaozhineng(question): if 你好 in question: return 你好呀我是小智 if 名字 in question: return 我叫小智是陪你练习的好朋友 if 天气 in question: return 我还没连上天气雷达明天就有了 if 再见 in question: return 再见祝你开心 return 这个问题有点难等我升级一下再回答你这个函数的本质就是“输入问题→判断关键词→返回答案”。真实的大语言模型逻辑比这复杂无数倍但框架是相通的大模型服务端也会根据输入文本经过一层层计算最后return一段生成的文字给调用方。所以孩子们理解了这个小函数就已经摸到了大语言模型应用的第一层门道。3.3 把返回的结果接着传给下一个函数明白了return还得明白“return出来的东西可以继续用”。我给了孩子们一个链条式的例子def jiancha(question): if 天气 in question: return tianqi if 名字 in question: return name return unknown def jieda(leixing): if leixing tianqi: return 今天是晴天适合出去玩 if leixing name: return 我叫小智 return 我还不会这个问题 q input(请提问) leixing jiancha(q) answer jieda(leixing) print(answer)第一个函数jiancha返回一个“类型标签”第二个函数jieda接收这个标签再返回最终的答案。这就是函数组合的雏形——一个函数的return结果是另一个函数的输入。在大语言模型应用的代码里这种链路到处都是取回请求结果、解析内容、再交给展示函数。3.4 认识真实的“接口返回”我给孩子们看了一段模拟“大语言模型接口返回”的数据让他们感受一下真实世界里的return。虽然做了一点简化但结构保留了def jiekou(shuru): # 模拟大语言模型返回的一个小结果 return { code: 200, answer: f我收到了你的问题{shuru}这是给你的回答 } r jiekou(今天吃什么) print(r[answer])这里的return把整个字典交了出来调用者访问r[answer]就拿到了真正的回答。真实的大语言模型接口经常返回一大包数据里面包含回答内容、消耗的token数、状态信息等等。孩子们只要知道“函数返回的是一包数据我们需要从中取出自己需要的部分”以后用大语言模型的库就会顺手很多。4. 动手实操用return搭建“魔法问答机”4.1 本节目标理论说了不少赶紧动手。第15课的实操任务是搭建一个“魔法问答机”它能让用户反复提问用我们写好的函数给出回答。做完这个小项目孩子们能亲身体会到return的价值每个函数都把处理结果交出来最后由主程序统一打印。完整目标效果是程序启动后先显示欢迎语用户可以输入问题程序调用一个“回答函数”根据问题内容返回回答输入“退出”时程序结束4.2 第一步写一个返回“问候语”的函数我们先写一个最简单的函数它不带参数直接返回一条问候语def huan_ying(): return 欢迎来到魔法问答机请输入你的问题我会尽力回答。输入退出结束程序。注意这个函数用了return而不是print。这样欢迎语不仅能显示还能被保存下来万一后面要把它写进日志或者做其他处理都能随时拿到。先让孩子们感受一下“返回”和“打印”的区别。然后在主程序里调用print(huan_ying())4.3 第二步写一个能“查字典”的回答函数这是问答机的核心。我把回答库放在一个字典里然后用函数去字典里找答案def hui_da(question): answers { 你好: 你好呀很高兴见到你, 名字: 我叫小问是一个练习用的问答机器人, 天气: 今天阳光不错记得多喝水, 作业: 写完作业再玩你会更开心, } for key in answers: if key in question: return answers[key] return 这个我还不会你换个问题试试吧这个函数就是一个简化版的大语言模型思维输入问题匹配关键词返回答案。孩子们很快就看懂了因为逻辑很直观。这里还引导他们注意一个细节for key in answers循环里一旦命中关键词return会立刻结束整个函数后面的循环就不跑了这样效率更高也不会返回多个答案。4.4 第三步组合起来做成循环问答有了核心函数我们来写主循环。用户会不断输入问题程序不断调用hui_da函数把返回的结果打印出来print(huan_ying()) while True: q input(你说) if q 退出: print(再见啦下次再来玩) break ans hui_da(q) print(小问, ans)这十几行代码里孩子们能看到一个完整的“应用”是怎么组装起来的函数负责产生结果主程序负责接收结果和控制流程。input函数接收用户输入并返回字符串这个返回值被q接住hui_da函数接收q返回答案答案被ans接住最后print显示。每一步都是return在传递数据。我建议孩子们亲手把这段代码完整敲一遍不要复制粘贴。敲错了没关系报错本身就是学习的一部分。4.5 思考题怎么让问答机“记住”回答次数课程最后我留了一个小挑战能不能让问答机记录自己一共回答了多少个问题每次回答完顺便把计数也打印出来。这里需要一点小技巧——函数内部没办法直接改外面的变量除非我们用return把新的计数值也“带出来”。参考写法def hui_da(question, count): answers { 你好: 你好呀很高兴见到你, 名字: 我叫小问是一个练习用的问答机器人, } count count 1 for key in answers: if key in question: return answers[key], count return 这个我还没学会, count count 0 while True: q input(你说) if q 退出: break ans, count hui_da(q, count) print(小问, ans, 这是第, count, 次回答)这个写法把count也通过return送出来外面再重新接住就实现了“函数内外数据交换”。孩子们看到变量count进了函数出来之后数字变大了都觉得很神奇。其实这就是参数传入、返回值传出的基本模式。5. 常见问题与排查技巧实录5.1 问题一函数显示None没有返回我想要的内容这是初学者最常遇到的问题。运行结果里出现None基本可以直接判断函数里写了print但没有写return。或者函数里确实写了return但某个分支没写导致那个分支默认返回None。排查三步法检查函数里是不是每个可能结束的地方都有return检查你是不是把return写在了if或者for循环里面有没有可能被跳过用print打印函数调用结果确认到底是“没返回”还是“返回了None”5.2 问题二return写在循环里结果循环只跑了一次一个典型错误是把return和循环的位置搞混。有些孩子想让函数循环处理多个数据却把return直接写进了循环体里def shuchu(): for i in range(3): return 第 str(i) 条消息这样写的效果是循环刚跑第一次return就终止了整个函数后面两次根本不会发生。正确的做法是先循环处理数据、把结果收集到列表里循环结束之后再return整个列表。5.3 问题三以为print就是return结果变量接不到值这个坑前面强调过。如果变量接到的值是None先去检查函数最后有没有return。我让孩子们记住一句话print做的是“表面功夫”return做的是“实质交接”。5.4 问题四return后面的代码永远不执行有的孩子会在return后面继续写代码期待它还能运行。比如def ceshi(): return 我是结果 print(这句话永远不显示)程序不会执行print那行因为return已经让函数“下班”了。这不是bug是return的规则。如果你希望“返回结果之后还要做点别的事”那些事必须写在return之前。5.5 给家长和老师的建议带孩子学这个内容最忌讳的就是死记概念。我建议用“礼物”这个话题引入让孩子先理解“交付结果”这件事。判断孩子是不是真的掌握了return不用考试让他做三件事就行让他把“问候语函数”改成“告别函数”让他把问答机里增加一个新的关键词和答案让他解释“为什么没有return外面就拿不到结果”能做到这三件说明这节课的核心他真的吸收了。如果还卡壳别急多回归自动售货机的例子把“投币、按钮、取饮料”三个动作对应到“参数、处理、return”上很快就能想通。6. 课后的一点体会每次带小学生学编程我都会反复确认一件事概念有没有变成孩子自己能讲出来的话。这节课的收获很大不是因为孩子们背下了return的语法规则而是他们能用自己的语言描述“函数把结果递出来”并且真的用这个知识做了一个问答机。如果你想让孩子继续往大语言模型应用方向走下一步可以试着引导他思考如果把answers字典换成一个大语言模型的接口调用程序会变成什么样那时候hui_da函数内部就不再查字典而是把一个请求发送出去拿到返回结果后再return给主程序。框架你已经会了剩下的就是填充更厉害的“内核”。