第四十二章:函数
复习
- 分支让程序选择路径,循环让程序重复路径。
- 一段程序现在可以由许多连续的语句组成。
TL;DR
- 函数把完成一项小任务的语句收进一个有名字的单元。
- 参数是调用者交给函数的输入,返回值是函数交回的结果。
- 函数能减少重复,并让程序按职责组织。
正文
假设程序中多次需要把两个数取较大者。把比较逻辑复制三遍当然能运行,却意味着规则变动时要改三处。我们可以把这件小事命名:
function larger(a, b):
if a > b:
return a
return b
best = larger(apples, pears)
这里的 larger 是一个函数。它像一台小机器:调用者把两个输入 a、b 交进去,函数按自己的步骤工作,再用 return 交出一个结果。a、b 叫作参数;它们让同一套步骤能处理不同输入。
函数最重要的价值不是节省几行字,而是划出边界。调用 larger(apples, pears) 的地方只需知道“它会给我较大的数”,不必每次重新阅读比较细节。复杂程序可以由许多这样的小任务组成:读取数据、计算税额、画一个按钮、保存文件。
有些函数不需要返回值,例如 show(total) 的职责只是显示结果。另一些函数可以调用别的函数。无论外面如何组织,每个函数都应尽量说清自己的输入、输出和任务;这正是程序逐步变大而仍可理解的基础。
从底层看,“调用”绝不只是跳到函数开头。CPU 还必须记住:做完以后应该回到哪里?参数和函数自己的临时变量又放在哪里?下一章会把这次来回的行李一件件打开。
思考题
为什么不把每一处
larger(x, y)都直接展开成比较语句?
小结
知识点
- 函数封装一项可命名、可复用的任务。
- 参数传入输入,返回值传回结果。
- 函数让调用者关注职责,而非每个内部步骤。
参考资料
- Barbara Liskov、John Guttag,《程序开发原理》
思考题答案(仅供参考)
函数可以集中保存一条规则,减少重复;修改比较方法时只改函数本身,也让调用处更容易读懂意图。
协议
本文采用 CC BY-NC-SA 4.0 协议发布。