📄 一句话概括
函数是把一段处理打包成的【机器】:参数是投料口、返回值是出料口、函数名是开关——一处定义、处处调用,这是代码复用的第一形态,也是【把大问题拆小】的工具。
📝 本节和前面几节的关系
4-1~4-3 备齐了顺序、分支、循环三大结构,函数把它们【打包命名】。回收 C++ 课第六章与树莓派课 6-5 的语法课,这里补齐【为什么要有函数】与【参数返回值的完整图景】。
一、函数:打包的处理机器
没有函数的世界:同一段【算平均分】的代码在程序里抄五遍,改一处漏四处。函数的世界:
def average(scores): # def 定义;scores 是参数(投料口)
"""算平均分:列表 -> 浮点数"""
return sum(scores) / len(scores) # 返回值(出料口)
print(average([88, 92, 75])) # 85.0 调用:喂参数、收返回值
print(average([60, 70])) # 65.0
三大收益:复用(一处定义处处调用)、命名(average(...) 自带注释功能)、分而治之(整个程序拆成一堆小机器,每台只管一件事)。
二、参数:投料口的两种形态
def greet(name, greeting="你好"): # greeting 是默认参数
return greeting + "," + name
print(greet("王明")) # 你好,王明(默认值生效)
print(greet("王明", "早上好")) # 早上好,王明
- 形参:定义时的占位名(name);实参:调用时喂的真值(王明);
- 默认参数:不喂就用默认值——调用方少敲;
- 参数可以有多个,也可以没有;没有参数的函数常是【执行动作】的(如打印菜单)。
三、返回值:出料口
def min_max(nums): # 返回多个值(其实是打包成元组,回收 3-11 的打包思想)
return min(nums), max(nums)
lo, hi = min_max([88, 92, 75, 60])
print(lo, hi) # 60 92
三条纪律:
return一执行函数立刻结束——后面语句不跑;- 没有 return 的函数返回 None——【函数里 print 了】不等于【函数返回了】(回收树莓派课 6-5:return 与 print 是两件事);
- 要【既给结果又给最小值】这类多输出,返回元组解包即可。
四、动手 Demo:函数改写前的对比
# 没有函数:三份相似代码
a = [88, 92, 75]
print(sum(a) / len(a))
b = [90, 80, 70, 60]
print(sum(b) / len(b))
c = [100]
print(sum(c) / len(c))
# 有函数:一处定义
def average(scores):
return sum(scores) / len(scores)
print(average(a), average(b), average(c))
看到什么算成功:三行平均分输出两次(85.0、75.0、100.0 各出现两遍)。
读结果:两组输出完全一样——但函数版把【算平均】的知识集中在一行;哪天要改成【去掉最高最低再平均】,只改函数内部一处。代码量不是收益,【只改一处】才是。
五、30 秒实验
跑 print(print("hi"))——先打出 hi,再打出 None。print 函数的返回值是 None(它只负责打印这个动作)——30 秒看清【动作型函数】与【计算型函数】的区别,也再次验证【没 return 就是 None】。
六、常见误区
- 【函数只是为了少写代码】——不完整。更重要的是命名抽象:读
send_alert(...)不用看内部就知道在干嘛——函数名是高层文档。 - 【函数里 print 了就算有结果】——错。print 是把字显示给人看;return 是把值交给调用方——给别人用的数据必须 return,打印替代不了。
- 【参数越多功能越强】——反了。参数超过四五个说明这台机器管得太宽(职责不清);拆成两个函数或用字典打包参数更好。
自测三问(点开对答案)
1. **形参与实参的区别?** 答:形参是定义时的占位名,实参是调用时喂进去的真值——机器的投料口标签与实际投进去的料。 2. **没有 return 语句的函数返回什么?** 答:None——【执行了 print】与【返回了值】是两回事,给别人用的数据必须 return。 3. **函数带来哪三大收益?** 答:复用(一处定义处处调用)、命名(函数名即文档)、分而治之(大问题拆成小机器)。- ☐ 下一节(4-5 值传递、引用传递、不可变、可变)
相关笔记
- 值传递与引用传递 —— 参数怎么进机器的下一课
- 树莓派 6-5 · Python 函数与模块 —— return 与 print 的坑
- C++ 6.1 · 函数概述 —— C 家族函数的定义
- ⌨️ 编程原理 · 索引 —— 全课路线图