欢迎来到子程序的世界!

在本章中,我们要学习如何成为“懒惰”的程序员——当然,这是好的那种!我们不需要重复编写同样的程序代码,而是要学习如何将程序代码打包成整洁的小套件,称为子程序 (Subprograms)。如果现在觉得程序设计像个解不开的谜题,别担心;看完这些笔记后,你就会明白子程序是如何让一切管理变得轻松多了!

先备知识检查:在开始之前,请记住程序是一系列给计算机执行的指令清单。而子程序就是储存在主程序里,一份较小的指令清单。


1. 什么是子程序?

子程序是一个能执行特定任务的独立代码块。可以把它想象成主程序里的“迷你程序”。在 Edexcel 的课程大纲中,你会学到两种主要类型:过程 (Procedures)函数 (Functions)

“披萨”比喻

想象你在写一份超级庞大的“披萨派对”食谱。与其每次提到披萨时都重复写一遍“如何制作面团”的步骤,你只需要把制作面团的步骤写在一个独立的盒子里,并命名为 MakeDough。每次你需要用到面团时,只要指向那个盒子就可以了!这就是子程序运作的方式。

为什么要使用它们?(好处)

  • 分解 (Decomposition): 它能将庞大且令人畏惧的问题,拆解成较小、易于处理的部分。
  • 可重用性 (Reusability): 程序代码只需写一次,就能多次使用。
  • 更容易测试: 你可以先测试一个小小的子程序,确认它运作正常,再把它放入主程序中。
  • 可读性 (Readability): 它能让你的程序代码看起来更整洁,人类读起来也更容易。

快速回顾:为什么要使用子程序?为了节省时间、减少错误,并让程序代码更易于阅读!


2. 过程 (Procedures) 与函数 (Functions)

这在考试中是一个非常重要的区别。虽然它们看起来很像,但有一个主要差异。

过程 (Procedures)

过程是一种执行特定任务,但不会将值传回主程序的子程序。它只是“完成它的工作”。
例子: 一个负责清除屏幕或是列印特定欢迎信息的子程序。

函数 (Functions)

函数是一种执行任务,并且必须回传一个值 (Return a value) 回到调用它的代码位置的子程序。它会“给予反馈”。
例子: 一个计算数字平方根并将答案提供给你的子程序。

记忆口诀: Functions Find a value! (它们会回传 (Return) 一个值)。

常见错误: 忘记函数必须要有 return 语句。如果它没有回传任何东西,那它其实就是一个过程!


3. 参数 (Parameters) 与实参 (Arguments)

有时,子程序需要信息才能执行任务。如果你有一个叫做 CalculateArea 的子程序,它就需要知道形状的长度与宽度。

  • 参数 (Parameters): 这些是在子程序定义中的“预留位置”。它们就像等待被填入信息的空槽。
  • 实参 (Arguments): 这些是你调用子程序时,真正传入那些空槽的数值。

逐步示例:
1. 你定义了一个函数:function calculate(number1, number2)。这里,number1 和 number2 是参数
2. 你调用了这个函数:calculate(10, 5)。这里,10 和 5 是实参

重点总结:参数是定义中的“标签”;实参则是程序执行期间实际使用的“真实数据”。


4. 局部变量 (Local Variables) 与全局变量 (Global Variables)

这与“范围 (Scope)”有关,意思就是“我可以在哪里看到这个变量?”

局部变量 (Local Variables)

局部变量是在子程序里面声明的。它只会在该子程序执行时存在。一旦子程序执行完毕,该变量就会被“删除”。
比喻: 你家的钥匙对你家来说是“局部性”的。它们在其他地方无法使用,且外面的人也不知道它们的存在。

全局变量 (Global Variables)

全局变量是在所有子程序外面声明的,通常在脚本的最上方。程序的任何部分都可以看到并使用它。
比喻: 太阳是“全局”的。无论你在哪个“子程序”(房间)里,每个人都看得到它。

你知道吗? 一般来说,使用局部变量会更好。如果你使用了太多的全局变量,一个子程序可能会意外地更改了另一个子程序正在使用的数值,从而导致“逻辑错误”!


5. 内置子程序与自定义子程序

你不需要每次都从头开始编写所有子程序!

  • 内置子程序 (Built-in Subprograms): 这些是程序语言(例如 Python)已经提供好的。例子包括 print()input()len()
  • 库子程序 (Library Subprograms): 这些是一组可以“导入 (import)”的预先编写好的子程序。例如,math 库让你能够访问 math.sqrt()
  • 自定义子程序 (User-Devised Subprograms): 这些是为了解决特定问题而亲手编写的程序。

快速回顾箱:
- 过程: 执行任务,无回传值。
- 函数: 执行任务,有回传值。
- 范围: 局部(内部)vs 全局(外部)。
- 单一入口/出口: 一个优秀的子程序应该从开头进入,并只有一个明确的出口!


总结检查表

在继续往下学习之前,确认你能回答这些问题:
1. 我能解释使用子程序的好处吗?(分解/可重用性)
2. 我知道函数与过程有什么不同吗?(回传值)
3. 我能在一小段程序代码中识别出参数吗?
4. 我理解为什么局部变量比全局变量“更安全”吗?

如果起初觉得有点困难,别担心!子程序就像积木——一旦你学会如何将它们组合在一起,你就能构建出更庞大、更酷的程序了!