当前位置:首页>python>《Python 从入门到精通》053|参数与返回值:函数真正的输入和输出

《Python 从入门到精通》053|参数与返回值:函数真正的输入和输出

  • 2026-10-11 07:49:57
《Python 从入门到精通》053|参数与返回值:函数真正的输入和输出

上一章我们已经正式认识了函数。

你已经知道,函数可以把一段逻辑封装起来,起个名字,以后想用的时候直接调用。 这一步非常重要,因为它让代码开始从一条流水账,慢慢变成一个个有边界的小工具。

但如果函数只会做固定一件事,很快就会遇到一个问题:

它太死了。

比如你定义一个函数,只会打印一句固定欢迎语:

defsay_hello():    print('你好,欢迎学习 Python')

这当然能跑。 可你马上就会想问:

如果我要欢迎张三怎么办 如果我要欢迎李四怎么办 如果我要欢迎不同城市的人怎么办 如果我不只是想打印一句固定内容,而是想让函数根据不同输入做不同处理,又该怎么写

这时候,参数就要出场了。

再进一步,你还会发现另一个问题:

有些函数不只是要做事,还要把结果交回来。 比如:

计算两个数的和 判断成绩是否及格 把一条脏文本清洗干净 求一个列表的平均值

这些事情如果函数做完后只是自己 print 一下,其实还不够。 因为很多时候,你想要的是这个结果本身,而不是只看一眼输出。

这时候,返回值就要出场了。

所以这一章非常关键。 因为从这一章开始,函数才真正开始活起来。

前一章的函数,更像一个只会固定动作的小机器。 这一章开始,函数终于有了真正的输入和输出。

一、为什么说参数和返回值,才是函数真正的灵魂

很多人刚学函数时,会误以为:

函数就是把几行代码包起来而已。

这话不能说错,但太表面了。

真正有用的函数,不是把一段固定代码装起来。 而是:

你可以给它不同的数据 它根据这些数据去处理 然后再把结果交还给你

你看,这一下函数就不再是僵硬动作了。 它开始像一个真正能工作的工具。

比如计算加法:

你不可能只想写一个永远计算 1 加 2 的函数。 你真正想要的是:

给它任意两个数 它都能帮你算出结果

这时候,这两个数就是参数。 而算出来的和,就是返回值。

所以参数和返回值加进来之后,函数才真正像一个完整的处理过程:

输入 处理 输出

这其实就是函数最核心的运行模式。

二、什么是参数

参数,你可以先把它理解成:

函数工作时需要的原材料

比如你让厨师做菜,总得先给他食材。 你让打印机打印,总得先给它内容。 你让一个函数欢迎某个人,总得先告诉它这个人是谁。

这个先提供给函数的信息,就是参数。

看一个最简单的例子:

defsay_hello(name):    print(f'你好,{name}')

这里的 name,就是参数。

它表示:

这个函数在执行时,需要一个名字 你给它谁,它就用谁

调用时可以这样写:

say_hello('张三')say_hello('李四')

输出:

你好,张三你好,李四

你会发现,这时候函数一下就灵活了。

它不再只能说固定一句话, 而是你给不同名字,它就能处理不同内容。

这就是参数最直接的作用:

让函数从固定动作,变成可适配不同输入的动作。

三、参数写在哪里

函数定义时,参数写在函数名后面的括号里。

比如:

defsay_hello(name):    print(f'你好,{name}')

这里括号里的 name,就是参数位置。

你可以理解成:

这个函数先提前声明 它需要一份叫 name 的输入信息

然后,调用函数时,把真正的值传进去:

say_hello('张三')

这时候 '张三' 就会交给参数 name。

也就是说:

定义函数时写的是参数名 调用函数时给的是具体值

这个区别你一定要尽早分清。

很多新手会把这两个混在一起。 其实它们一个是占位置的名字,一个是真正传进去的数据。

四、参数名和真正传进去的值,不是一回事

看下面这段代码:

defsay_hello(name):    print(f'你好,{name}')

这里的 name,只是一个变量名。 它像是函数内部留出来的一个位置。

当你调用:

say_hello('张三')

这个时候,'张三' 才是实际传进去的值。

所以可以这样理解:

name 像一个收件箱标签'张三' 才是塞进去的内容

再比如:

say_hello('李四')

这次参数 name 接到的,就是 '李四'

所以参数不是写死的数据, 而是专门用来接收外部输入的变量。

这个理解特别重要。 因为后面你会发现,函数之所以灵活,就是因为参数位置不变,但传进去的值可以不断变化。

五、没有参数的函数,和有参数的函数,到底差在哪

我们来直接对比一下。

没有参数:

defsay_hello():    print('你好,欢迎学习 Python')

它每次调用都只会打印同一句话。

有参数:

defsay_hello(name):    print(f'你好,{name}')

它每次调用都可以根据传进来的名字变化。

所以区别非常明显:

没有参数的函数,像一个固定动作按钮 有参数的函数,像一个带输入口的小机器

前者当然也有用。 比如打印分隔线、显示固定菜单、输出固定提示。 但真正更常用、更强大的,往往是带参数的函数。

因为现实里的很多任务,本来就不是固定的。 而是同一类动作,要处理不同数据。

六、一个函数可以有多个参数

当然可以。

比如你想输出一个人的姓名和年龄:

defshow_info(name, age):    print(f'我叫{name},今年{age}岁')

调用:

show_info('张三', 18)show_info('李四', 20)

输出:

我叫张三,今年18岁我叫李四,今年20岁

这里的 name 和 age,就是两个参数。

也就是说,一个函数不一定只收一份输入, 它可以收多份。

比如:

姓名 年龄 城市 成绩 商品名 价格 数量

这些都可以作为参数交给函数。

只要这些信息是这个函数完成任务所需要的原材料,它们就可以变成参数。

七、多个参数时,顺序为什么很重要

看这个例子:

defshow_info(name, age):    print(f'我叫{name},今年{age}岁')

如果你这样调用:

show_info('张三', 18)

没问题。

但如果你反过来写:

show_info(18, '张三')

输出就会变成:

我叫18,今年张三岁

程序未必报错, 但结果明显不对。

因为参数是按顺序一一对应接收的。

第一个值给第一个参数 第二个值给第二个参数

所以你以后看到多个参数时,要有一个特别自然的意识:

顺序不能乱

这也是为什么上一章说,函数不仅是语法,更是在训练你整理逻辑。 因为你必须清楚,这个函数到底需要哪些信息,而且这些信息的排列和角色是什么。

八、参数让函数真正开始像“工具”了

我们来看一个更像工具的例子。

定义一个函数,计算长方形面积:

defarea(length, width):    print(length * width)

调用:

area(5, 3)area(10, 4)

你会发现,这时候函数已经不像是在执行一段固定动作了。 它更像是一个真正可用的小工具。

你给它不同的长和宽, 它就帮你算出不同的面积。

这就是参数的价值。

它不是让函数多了点装饰, 而是让函数开始真正具有通用性。

以前是写死一个值。 现在是给不同输入,都能正确处理。

这是函数特别关键的一次升级。

九、但这里有个问题:只 print 结果,真的够吗

很多新手刚开始写函数时,特别喜欢这样写:

defadd(a, b):    print(a + b)

调用:

add(3, 5)

输出:

8

表面看,问题不大。 因为确实算出来了。

但你很快就会发现,这种写法有个限制:

它只是把结果打印出来了 却没有真正把结果交还给外面

比如你想继续拿这个结果去做别的事:

把它再乘 2 拿去判断大小 保存到变量里 和别的函数结果拼起来

这时候,只 print 一下就不够用了。

因为 print 只是给人看, 而不是把结果交给程序继续处理。

这就是返回值存在的意义。

十、什么是返回值

返回值,你可以先把它理解成:

函数做完事之后,交回来的结果

比如你拿两个数交给函数, 它帮你算完和, 然后把这个和还给你。

这个 还回来 的结果,就是返回值。

在 Python 里,返回值通常靠 return 来实现。

看最简单的例子:

defadd(a, b):return a + b

这里的意思是:

把 a + b 的结果返回出去

调用时可以这样写:

result = add(3, 5)print(result)

输出:

8

这和刚才那个只 print 的版本看起来差不多, 但本质上差别非常大。

因为现在这个结果,被真正交还给了外面。 你可以把它存起来、继续计算、继续传给别的函数。

这才是函数更完整的输出方式。

十一、print 和 return,差别到底在哪

这个点一定要讲透。

很多新手前期最容易把 print() 和 return 混掉。

我们直接对比。

第一种:

defadd(a, b):    print(a + b)

第二种:

defadd(a, b):return a + b

看起来都和加法有关。 但它们做的事完全不一样。

print() 的作用是:

把内容显示出来,给人看

return 的作用是:

把结果交还给函数外部,给程序继续用

这两者不是一个层级的东西。

一个偏显示。 一个偏传递结果。

所以以后你一定要记住一句特别重要的话:

print() 是展示return 是返回结果

很多初学者函数写不顺,核心问题就在这里没分清。

十二、一个特别直观的对比例子

先看 print 版本:

defadd(a, b):    print(a + b)result = add(3, 5)print(result)

输出会是:

8None

很多人看到这里会一脸懵。

为什么又多出来一个 None?

因为 add(3, 5) 这个函数本身没有返回值。 它只是打印了 8, 但真正调用结束后,没有把结果交还出来。 所以 result 接到的是 None

再看 return 版本:

defadd(a, b):return a + bresult = add(3, 5)print(result)

输出:

8

这次就正常了。

因为函数真正返回了 a + b 的结果。 所以 result 才接到了 8。

这个对比你一定要亲手敲一遍。 它会帮你彻底分清 print 和 return 的角色。

十三、为什么 return 才是函数真正的输出

因为程序真正要的是结果,而不是只是看一眼。

比如你算两个数的和,不一定只是想打印出来。 你可能还想:

继续乘 10 判断是不是大于 100 保存起来 传给别的函数

比如:

defadd(a, b):return a + bx = add(3, 5)y = add(10, 20)print(x * 2)print(y > 25)

输出:

16True

这就是返回值的力量。

函数不再只是自己在里面干一圈然后喊一句结果。 它开始真正把结果交给外部,让整个程序继续流动起来。

所以参数和返回值一结合,函数才真正形成完整闭环:

接收输入 内部处理 交回结果

这才是函数真正成熟的形态。

十四、一个函数可以没有返回值吗

当然可以。

比如:

defshow_menu():    print('1. 登录')    print('2. 注册')    print('3. 退出')

这个函数的目的就是展示菜单。 它本来就不需要返回什么结果。

所以不是所有函数都必须有 return。 这要看你的函数职责是什么。

如果它只是负责展示、打印、提示, 没有返回值也很正常。

但如果它的作用是:

计算 判断 提取 转换 清洗 处理后产出一个结果

那通常就应该考虑返回值。

你可以这样简单区分:

负责“做动作”的函数,可能不一定要返回值 负责“产结果”的函数,通常更需要返回值

十五、一个函数可以返回什么

目前阶段你可以先理解成:

几乎任何类型的数据都能返回

比如返回一个数字:

defadd(a, b):return a + b

返回一个字符串:

defwelcome(name):returnf'欢迎{name}学习 Python'

返回一个布尔值:

defis_pass(score):return score >= 60

返回一个列表:

defget_names():return ['张三', '李四', '王五']

你会发现,返回值不是只局限于数字。 只要这个函数处理后的结果是什么,就可以返回什么。

这一点特别重要。 因为它说明函数不仅能算数, 还能生成文本、判断真假、提供数据结构。

这也是为什么函数能在程序里无处不在。

十六、参数和返回值放在一起,函数终于完整了

我们来看看一个真正完整的小函数:

defget_total(price, count):return price * count

这里:

price 和 count 是参数price * count 的结果是返回值

调用:

total = get_total(59.9, 3)print(total)

输出:

179.7

这个函数就非常典型。

它接收输入 完成处理 给出结果

你会发现,这时候函数已经很像现实里的机器设备了。

你投进去原材料 它加工 再把结果吐出来

这就是参数和返回值真正让函数活起来的原因。

十七、再看一个判断型函数

比如判断成绩是否及格:

defis_pass(score):return score >= 60

调用:

print(is_pass(90))print(is_pass(45))

输出:

TrueFalse

你看,这里函数没有 print 什么及格不及格的句子。 它只是老老实实返回判断结果。

这反而更好用。

因为你后面可以自己决定怎么处理这个结果:

score = 75if is_pass(score):    print('及格了')else:    print('没及格')

这就体现出一个非常重要的编程思想:

函数尽量只负责把结果算出来 至于这个结果怎么展示、怎么使用,可以交给外部决定

这个思路你现在先有感觉就行,后面会越来越重要。

十八、一个常见误区:什么都写进函数里

很多新手刚学到这里,容易犯一个错。

既然函数这么方便,那我把计算、判断、打印、格式化、各种事情全塞一个函数里。

能不能跑? 当然能。

但这样写往往会让函数变得特别臃肿。

比如:

defcheck_score(score):if score >= 60:        print('及格了')else:        print('没及格')

这也不是错。 只是它把 判断 和 输出 展示 捆在一起了。

更灵活的写法往往是:

defis_pass(score):return score >= 60

然后外面自己决定怎么显示。

这不是绝对规则。 但它会让你的函数更通用、更容易复用。

所以你从这一章开始,要慢慢建立一个意识:

函数最好尽量职责明确 别什么都往里塞

十九、参数和返回值,正在训练你什么能力

表面上看,是在学函数。 更深一层,其实是在训练你思考:

一个小功能到底需要什么输入 又应该交出什么输出

这非常重要。

因为后面不管你写函数、写类、写模块、写接口, 核心都绕不开这两个问题:

你需要别人给你什么 你又要把什么交还出去

你会发现,这其实已经非常接近真正的软件设计思维了。

所以参数和返回值不是一个小语法点。 它是在训练你理解“输入”和“输出”的边界。

二十、来看一个非常像工具的文本清洗函数

前面字符串阶段你已经做过文本清洗。 现在我们用函数来重写这种逻辑。

比如定义一个函数,专门清洗一条简单用户信息:

defclean_text(text):    text = text.strip()    parts = text.split(',')    result = []for item in parts:        result.append(item.strip())return result

调用:

data = clean_text('  张三 , 18 , 北京  ')print(data)

输出:

['张三', '18', '北京']

这个例子特别有味道。

因为你会发现,函数现在已经不像课堂玩具了。 它开始像一个真正能解决问题的小工具。

你给它一条脏文本 它帮你洗干净 再把结果交回来

这就是函数真正的输入和输出。

二十一、返回值为什么比你想象中更重要

因为没有返回值,很多逻辑就断掉了。

比如你想先清洗文本,再把结果转字典,再保存到列表。 如果清洗函数只是自己 print 一下,你后面的步骤根本接不上。

但如果它返回清洗后的结果,就可以继续接着写:

defclean_text(text):    text = text.strip()    parts = text.split(',')    result = []for item in parts:        result.append(item.strip())return resultdata = clean_text('  张三 , 18 , 北京  ')student = {'name': data[0],'age': data[1],'city': data[2]}print(student)

你会发现,返回值让整个程序真正串起来了。

所以函数不是定义出来就完事。 真正让函数参与程序流转的,往往恰恰是返回值。

二十二、最容易犯的几个错

这一章坑非常多,我给你提前点出来。

第一个错,函数定义了参数,但调用时没传值。

比如:

defsay_hello(name):    print(f'你好,{name}')say_hello()

这会报错。 因为函数明确说了,它需要一个名字,你却没给。

第二个错,参数个数对不上。

比如定义两个参数,却只传一个,或者传三个。 这都会有问题。

第三个错,把 print() 当成返回值。

这个前面已经讲透了,一定要分清。

第四个错,写了 return 之后,外面却不用返回结果。

比如:

defadd(a, b):return a + badd(3, 5)

虽然没错,但如果你后面不用它,这个返回值的价值就没有发挥出来。

第五个错,是函数职责太乱。 一会儿负责计算,一会儿负责打印,一会儿又负责输入,所有事情糊在一起。 这样函数会越来越难用。

二十三、这一章最该建立的,不是记忆,而是函数运行流程感

你以后看到一个函数,脑子里最好自动过这三步:

它接收什么 它内部做什么 它最后给出什么

比如:

defadd(a, b):return a + b

你就要能自然地看出:

接收 a 和 b内部做加法 返回结果

再比如:

defwelcome(name):returnf'欢迎{name}学习 Python'

你要能看出:

接收 name内部拼接字符串 返回欢迎语

这种流程感一旦建立起来, 你以后自己写函数就不容易乱。

二十四、练习题:这章一定要自己敲顺

下面这些练习非常关键,建议你一定要亲手写。

1. 定义一个函数,接收名字,打印欢迎语

defsay_hello(name):    print(f'你好,{name}')say_hello('张三')say_hello('李四')

2. 定义一个函数,接收两个数,返回它们的和

defadd(a, b):return a + bresult = add(3, 5)print(result)

3. 定义一个函数,接收成绩,返回是否及格

defis_pass(score):return score >= 60print(is_pass(80))print(is_pass(45))

4. 定义一个函数,接收商品价格和数量,返回总价

defget_total(price, count):return price * countprint(get_total(29.9, 3))

5. 定义一个函数,接收一条带空格的文本,返回清洗后的结果

defclean_text(text):return text.strip()print(clean_text('  hello python  '))

你把这些最基础的练习写顺以后,参数和返回值的感觉就会明显起来。

二十五、本章小结

这一章非常关键,因为从这一章开始,函数终于不再只是一个固定动作盒子了。

参数,负责把外部信息送进函数。 返回值,负责把处理结果交回外部。

它们让函数真正形成了完整闭环:

接收输入 内部处理 输出结果

你要牢牢记住几件事:

参数写在函数定义时的括号里 调用函数时传入具体值 多个参数按顺序对应print() 是展示return 是返回结果 函数到底该不该返回值,要看它有没有真正产出结果

如果上一章是让你学会把一段逻辑封装起来, 那么这一章,就是让你开始学会让这个小功能真正和外部世界发生数据交换。

这一步非常关键。 因为从现在开始,函数终于不只是能“做事”,而且能“接收信息、交出结果”了。

下一章我们继续讲 位置参数、默认参数、关键字参数,一篇讲透。 到那一章,你会发现,参数虽然已经让函数灵活起来了,但参数本身也有很多更细的讲究。

最新文章

随机文章