☰
Python函数return详解:从自动售货机到大语言模型应用
2026/10/6 17:31:37 网站建设 项目流程

上一课我们认识了函数这只“小盒子”,知道把代码装进去,就能反复使用。今天第15课,我们要拆开函数里最特别的一份“礼物”——return。这个英文单词的意思是“返回、归还”,很多同学第一眼看到它,以为它只是结束函数用的,其实它是函数把计算结果“亲手递给你”的那只手。学大语言模型应用时,return尤其重要,因为当你写一个函数去调用大模型,模型给你的回答,正是靠return送回程序里的。可以这么说:没有return的函数就像一台只亮灯不出票的机器,看着在运转,但你什么也拿不到。

这节课我打算用一个非常轻松的节奏来讲:先通过生活里的故事理解return是干什么的,再上手写几个带return的小程序,然后专门看看在大语言模型应用里,return是怎么帮我们“跑腿”的。最后我会把我带小学生时遇到的各种奇奇怪怪问题整理成一份避坑手册,家长们也可以一起看,辅导时不抓狂。

1. 函数“带礼物回家”:用生活语言认识return

1.1 自动售货机的故事:你在“调用”,机器在“返回”

想象你站在一台自动售货机前面,投进去5块钱,按一下“可乐”按钮,然后“哐当”一声,一瓶可乐从出口掉出来。在这个场景里,售货机就是一个函数,你投进去的钱相当于传给函数的参数,而掉出来的可乐,就是函数的返回值。

如果你按了按钮,机器咔咔响了一阵,却没有东西掉出来,你肯定会觉得这台机器坏了。编程里的函数也一样:有些函数执行完,需要把一个结果交回给调用它的地方,这个“交回”的动作,就是return。return后面跟着的东西,就是你要的那瓶“可乐”。

为什么这个比喻特别适合小学生?因为孩子对“买东西找零”有天然的生活经验。函数就像售货员,你告诉它需求,它忙完以后,必须把手里的结果递给你。如果售货员忙半天,什么都不递出来,你就不知道事情到底办成没有。return就是那个“把东西递给你”的动作。

我再举一个例子:你让爸爸去超市帮忙买一袋盐,爸爸回来的时候,盐就是“返回值”。如果爸爸空着手回来,你会问“盐呢?”——在程序世界里,那个“盐呢?”的答案,就要靠return来回答。

1.2 为什么需要保存结果:从“计算出”到“拿得到”

有同学会问:“老师,函数里不是可以直接print把结果打印出来吗?为什么要多此一举用return?”这个问题的答案,是孩子理解return的第一次飞跃。

你可以这样跟孩子解释:print像是把答案大声喊出来,喊完就没了,别人记不住;而return像把答案写在一张纸条上交给你,你可以把纸条放进书包,什么时候想用都能拿出来。程序里的“记住”和“拿到”,比“看到”更重要。

举个例子,我们想写一个“计算长方形面积”的函数。如果函数里只print结果,那这个结果就只是“看了一眼”;但如果用return返回面积,我们就能把这个数值存到一个变量里,接着用它去做别的事,比如比较两个长方形谁更大,或者把面积加起来算总面积。

这就是return的核心价值:函数负责计算,外面负责使用。计算和使用的分离,让程序可以像搭积木一样,把一个函数的返回值,喂给下一个函数当输入。在大语言模型应用里,这个思路会被反复用到——你调用一次模型接口,模型把回答返回来,你再去处理这个回答。

2. 写第一个会“回信”的函数:return基础语法

2.1 一个计算字数的函数:三行代码理解return

我们直接看Python代码。假设你收到一段大语言模型生成的回答,你想知道这段回答一共多少个字,就可以写一个函数:

def count_words(text): # text是传进来的字符串,len()用来数长度 result = len(text) return result

这个函数做了三件事:接收一段文字,用len()算出字数的结果,再用return把结果交出去。调用的时候这样写:

answer = count_words("你好,我是人工智能助手。") print(answer)

运行之后,屏幕上会显示一个数字,比如11。关键就在这一行:answer = count_words("你好,我是人工智能助手。")。这个等号的意思是,把函数返回的那个数字,装进answer这个变量里。如果没有return,answer就是None,什么都没有,后面print出来的就不是数字了。

我在课堂上的做法是,先让孩子在这个函数里加上return,运行;然后把return那一行删掉,再运行。看着屏幕上出现“None”,孩子一下子就明白了:原来没有return,函数虽然跑了一圈,但什么都没带回来。这种“对比实验”比讲十遍理论都有效。

2.2 return后面可以跟什么:数字、文字、计算式

return后面接的东西,比很多同学想的更灵活。它可以是具体的数字,像return 3;也可以是文字,像return "你好";还可以是一个计算式,比如:

def add(a, b): return a + b

这个函数返回的不是a也不是b,而是a加b的结果。程序执行到return这一行时,会先算出后面的表达式,再把结果返回到调用处。所以return a + b其实相当于先算出一个新值,再把它交出去。

更妙的是,return后面还可以接另一个函数的调用。你可以在一个函数里写return double(3),意思是先让double函数计算3的两倍,再把那个结果直接返回。这样函数之间就像接力赛一样,一棒接一棒。

给小学生的记忆口诀是:return是顺风车,不管后面带着什么,只要到了这一行,它就把东西打包放上顺风车,直接送到调用函数的那个地方。我们不需要理解计算机底层怎么搬运,只需要知道这个“打包送达”的过程。

2.3 最容易混的一对:return和print到底差在哪

这是课堂上每个班都会有人问的问题,也是家长辅导时最容易卡住的地方。我用一个“考试交卷”的例子来讲:print是你在考场上大声喊出答案,全班都听到了,但喊完你手上并没有写下来的答案纸;return是你把答案写在答题纸上,走出考场后,这张纸还在你手里,你可以带去下一场考试用。

从技术角度看,print是一个“输出到屏幕”的功能,它负责让人看见内容;return是一个“函数向外传递结果”的机制,它负责让程序继续使用内容。两件事经常一起出现,但它们服务的目标完全不同。

如果你写了一个只print不return的函数,你在函数外面就永远拿不到它的计算结果,哪怕你写result = add(1, 2),result也只会是None。这就像你让同桌把答案写在黑板上展示,但你想要一份带回家的答案,他却没有给你。程序运行起来不报错,但后面的代码完全没法用这个结果。

3. 让函数替我们“问”大语言模型:return的实战升级

3.1 设计一个ask_llm函数:输入问题,返回答案

现在我们把return放到大语言模型应用的真实场景里。很多同学听到“大语言模型”会觉得很高大上,其实你可以把它理解成一位知识非常渊博的“网上邻居”。我们给它一句话,它会回我们一句话。编程里和这位邻居打交道时,最标准的做法就是写一个函数。

想象一下这样的函数:

def ask_llm(question): # 假装这里是调用大模型的代码 # 模型经过思考,生成了一段回答 answer = "这是模型生成的回答" return answer

实际调用时,你只需要写:

reply = ask_llm("请用一句话介绍北京的春天") print(reply)

这里的reply,就是那个大模型回答被return接住的变量。哪怕以后你接的是真实的云服务接口,核心逻辑也是完全一样的:你发送问题给接口,接口返回一段JSON数据,你的代码里往往是return response_data,把那段数据原封不动地交回给调用者。所以return不是Python小练习里的玩具,它是真实AI应用里每天都要用的基本功。

市面上有人把大语言模型、生成语言模型这些名词混着用,其实对小学生来说不用太纠结它们是不是一个东西。你只需要知道:我们写代码跟“模型”打交道时,函数负责把用户的问题送进去,再把模型的回答带回来。这个“带回来”的动作,靠的就是return。

3.2 参数是“输入口”,return是“输出口”

函数像一台机器,左边有一个输入口,右边有一个输出口。参数就是走进输入口的东西,return就是输出口递出来的东西。没有参数,函数没办法接收外面的信息;没有return,函数干完活也不会把结果交给外面。两个加在一起,函数才算真正“通”了。

我带孩子写AI小工具时,会故意用这个思路设计练习。比如做一个“情绪温度计”函数:传入一句话,返回一个分数,分数代表这句话是开心还是难过。函数的参数负责接收句子,函数内部做一些简单的关键词判断,最后用return把分数送出来。孩子看到同一个函数,传进不同的话,返回不同的分数,马上就理解了“输入-处理-输出”这个万能模型。

这个模型以后会反复出现。哪怕你学的是图形化编程、JavaScript,或者其他任何语言,只要有函数的地方,就有参数和return这对黄金搭档。小学阶段把这一个模型吃透,后面学任何语言都不会慌。

3.3 return在真实AI应用里会返回什么

讲到这里,有些家长可能会问:真实的大语言模型返回的东西,和课堂上那种简简单单的文字一样吗?真实的调用确实会复杂一些,模型接口返回的往往是一坨JSON数据,里面有回答内容、使用token数量、生成耗时等等。但坏消息是复杂,好消息是这些数据依然是通过return送出来的。

假设你用一个现成的SDK写代码,常常会看到这样的大致结构:

def get_ai_answer(prompt): response = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": prompt}] ) return response.choices[0].message.content

这里面的response是一个很复杂的对象,但我们并不需要在函数里把它全部拆开,而是直接取到我们想要的那一段文字,然后return出去。哪怕是职业程序员,也不会把整个返回对象暴露到每个角落,都是“拿到手,挑出需要的,再传下去”。这和课堂上return一个字符串、一个数字的思路,一模一样。

在小学生阶段,我不建议急着让孩子去理解JSON、API这些名词,先让他们形成“函数最后会把一个结果还给我”的直觉就够了。等未来某一天,他们真的接上大模型接口,发现接口返回的数据可以用return交给别的函数继续处理,自然会回想起今天这节课。

4. 踩坑现场记录:return里常见的几个“没想到”

4.1 return之后还会执行吗:函数“到此为止”

这是孩子第一次写多个return时最容易犯的错,也是真实的运行时行为。在函数里,只要执行到return这一行,函数就会立刻结束,后面的代码不会再跑。return就像是公交车的终点站,到了站,乘客全部下车,司机不会再往前开。

看这个例子:

def test(): return 1 print("这行永远不会打印")

函数执行到return 1就停住了,下面的print完全不会被执行。很多小白会问:“为什么我的打印语句不见了?”答案就在这里。这不是bug,这是return的规则:它既是“交结果”,也是“喊停”。

实际调试时,我常让孩子做一个“return定位”练习:在一段函数里,故意在return前后各写一个print,运行后看哪条print出现了,哪条没出现。这个小小的实验,能让他们牢牢记住“return之后是代码禁区”。如果你检查自己的代码,发现某个print永远不显示,先去看看是不是上面有个return提前截胡了。

4.2 多个return:让函数学会做选择题

一个函数里可以有多个return,但同一时刻只会有一个真正执行。这有点像交警指挥交通:到了分岔路口,只能选一条路走。

最常见的写法是结合if判断:

def check_score(score): if score >= 60: return "及格" else: return "需要加油"

调用时,传入的分数不同,返回的结果就不同。这个函数里有两条return,但每次调用只走其中一条。如果分数是80,就走第一条;如果是45,就走第二条。

我特别提醒家长一点:孩子写这种多return函数时,经常忘记写第二个return,导致函数“无路可走”。比如只写了if里的return,没有写else分支,最后程序会默认返回None。像上面的例子,如果去掉else里的return,不及格的学生就什么都得不到。解决的办法很简单:先想清楚“如果条件不满足,应该返回什么”,再动手写代码。

还有一种情况是函数内部没有if,但写了多个return,比如:

def early_return(): return "第一个" return "第二个"

这种代码里,第二个return永远碰不到。这在语法上没错,但属于逻辑冗余,孩子要学会删掉它。写代码不只是让程序能跑,还要让读代码的人一眼看懂你的意图。

4.3 常见问题速查表

我把课堂上出现频率最高的问题整理成了表格,家长可以直接对照排查:

问题现象可能原因解决方法
函数外变量等于None函数里只print了结果,没用return把print改成return
想返回多个数,只会返回最后一个多个return排成了一列,前面的执行不到用元组返回多个值,比如return a, b
函数里的print没显示执行到前面的return,函数提前结束了把print移到return之前
明明return了数字,外面变成字符串返回时用str()转换过类型检查return后的表达式,统一类型
调用函数没有用变量接住返回值没有被赋值,就消失了写 result = 函数名()
没有调用函数,直接试returnreturn只能写在函数里先定义函数,再在外部调用它

这份表格不是让孩子背的,而是让他们在遇到问题时学会“对照症状找原因”。会排查问题,比会默写代码更重要。

4.4 我常用的调试三招:怎么看return到底给了什么

第一招,在调用处打印返回值。也就是在函数外面写print(函数名(参数)),这一步能让你立刻看到return交出了什么。大多数时候,问题出在返回值的类型或内容不如预期,一眼就能发现。

第二招,用type()检查类型。如果怀疑返回的东西不是想要的类型,可以在外面加上print(type(函数名(参数)))。比如明明想返回数字,却返回了字符串,type就会直接告诉你真相。

第三招,临时加一个变量。我会让孩子在函数里多写一行print("我要返回的是:", result),确认result是对的那个值,再写return。这招看起来笨,但在初学阶段非常有效,能帮孩子把“计算过程”和“返回结果”分开看清楚。等熟练以后,可以删掉这些临时的print。

这三个方法都能在IDLE或者你用的编程环境里直接用,不用额外装任何东西。调试不是大人的专利,小学生完全可以掌握。我第一次教这招时,有个孩子回家后自己给哥哥的代码“看病”,居然真的找出一个返回了None的bug,特别有成就感。

5. 课后练习与下一步:把return变成自己的工具

5.1 三道由易到难的小练习

练习一:写一个函数,接收一个数字,返回它的两倍。要求必须用return,并在函数外打印结果。这道题练的是最基本的“参数进、return出”。

练习二:写一个函数,接收两个数字,返回较大的那个。提示:可以用if和return配合。这道题练的是“二选一”的return结构。

练习三:写一个函数,接收一段文字,返回这段文字加上“(已收到)”这几个字。然后把这个函数和之前学过的内容组合起来:先让用户输入一句话,再调用这个函数,最后打印返回值。这道题练的是把return结果接到真实的使用场景里。

我给孩子们的建议是:不要追求一次写对,先故意写几个错误的版本,看看程序怎么报错,再看看返回值是什么,通过“试错”来建立自己的经验库。大胆犯错,反复尝试,这本身就是编程最有趣的部分。

5.2 学完return后,知识地图的下一站

return学完,函数这块最重要的拼图就差不多齐了。有了参数,函数能接收外面传进来的信息;有了return,函数能把结果交出去。这两样东西配合起来,你就可以开始尝试做真正的小工具了。

比如,你可以写一个函数,接收一句中文,返回一句英文,再写一个函数,接收英文,返回这段英文的长度。把两个函数串在一起,就形成了一个最简单的“文字处理流水线”。在大语言模型应用的世界里,这种“把结果从一个函数传给下一个函数”的模式,正是构建更多复杂应用的基础——你可以把用户输入清理干净,再喂给模型;模型返回答案后,再让它去查询天气;一切工作流,本质上都是函数之间不停地把return结果递来递去。

如果想继续深入学习,下一课我建议聊聊“列表和字典”,因为大语言模型返回的内容,通常是被包在这些容器结构里的。学会了容器,再回头看return返回的一坨数据,你就能像拆礼物一样,把它一层层剥开,取出自己真正需要的那份宝藏。

我个人在带小学生过程中的体会是:函数是不是写得优雅并不重要,重要的是孩子能感觉到“我写了一个东西,它真的把结果交回给我了”。这个小小的成就感,是持续学编程最强有力的引擎。上一课孩子学会“把代码装进函数”,这一课孩子学会“让函数把结果交给别人”,两节课连起来,他们手里就已经握住了所有程序之间协作的万能接口。有了这个接口,大语言模型应用的探险之路,才算真正开始。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询