科创科普:从「积木」到「函数」——把常用代码打包成魔法积木

科创科普:从「积木」到「函数」——把常用代码打包成魔法积木

一、重复的烦恼

用 Scratch 画一个正方形,你需要「移动 100 步 → 右转 90 度」,重复四次,一共八块积木。如果改成画正六边形,就要改成「移动 100 步 → 右转 60 度」,重复六次。而如果你要在画布上画 10 个大小不同的正方形,积木数量会成倍增长,脚本区很快就堆成一片。

这时程序员的直觉是:能不能把「画正方形」这件事本身做成一块新积木?以后只要喊一声「画正方形,边长 50」,它自己就去执行那八块积木。这个想法,就是函数(Function),在 Scratch 里叫「自制积木」。

二、什么是函数

函数是一段被起了名字、可以反复调用的代码。它把「怎么做」藏起来,只露出「叫什么、要什么、给什么」。

举一个生活类比:微波炉上的「解冻」按钮。你不知道里面怎么控制功率和时间,但只要按下按钮、放入食物,就能得到结果。函数就是这个按钮:名字是「解冻」,参数是食物,返回值是解冻好的食物。

三、函数的三要素

  1. 名字:调用时的「口令」,例如 画正方形、calculate_area。起名要用动词或动宾短语,看得懂它是干什么的。
  2. 参数(输入):调用时需要交给函数的数据。可以没有参数,也可以有多个。例如边长、半径、要打印的名字。
  3. 返回值(输出):函数算完之后交回来的结果,用 return 交出去。没有返回值时,函数只是「做了件事」,例如播放一段声音。

一个容易忽略的要点:参数是「局部」的。函数里的参数名只在这个函数内部有效,函数外面的同名变量不会受影响。就像你在不同的教室里都喊「小明」,各自对应各自的那个同学。

四、案例一看:Scratch 自制积木画正多边形

步骤: 1. 在「自制积木」分类里点击「制作一个积木」,取名为「画正多边形」,并添加两个输入项:边数 n、边长 len。 2. 在积木下方写:重复执行 n 次 → 移动 len 步 → 右转 360 除以 n 度。 3. 主程序:当绿旗被点击 → 落笔 → 画正多边形 边数 3 边长 100 → 抬笔 → 移到 x:150 y:0 → 落笔 → 画正多边形 边数 6 边长 60。

效果:一个三角形和一个六边形,只用了两块「画正多边形」的积木。以后想画正十二边形,直接改输入项即可。你也可以再加一块「画花」的积木,让它调用 12 次「画正多边形」,这就是函数调用函数。

五、案例二看:Python 里定义函数

def area_of_circle(r): pi = 3.14159 return pi * r * r

def greet(name): print("你好," + name + "!欢迎来到编程世界。")

print(area_of_circle(10)) # 输出 314.159 greet("小华") # 输出 你好,小华!欢迎来到编程世界。

第一行 def 是 define(定义)的缩写,冒号后面的缩进部分就是函数体。area_of_circle 有参数 r、有返回值;greet 有参数、没有返回值,它只是执行打印。返回值和打印是两回事:打印只是把结果给人看,返回值是把结果交给程序的下一步继续使用。

六、例题解析

例题:下面程序的输出是什么?

def double(x): x = x * 2 return x

n = 7 m = double(n) print(n, m)

解析:调用 double(n) 时,把 n 的值 7 复制给参数 x。函数内部 x 变成 14 并返回,赋给 m。函数内部的修改不会影响外面的 n,因为传进去的是值的一份拷贝(对数字、字符串这类简单数据而言)。所以输出是 7 14。

如果想让外面也跟着变,就应该把返回值接住:n = double(n)。

七、四个常见错误

  1. 定义了却忘记调用。写完 def 之后不写 greet("小明"),程序什么也不会发生。
  2. 参数个数不匹配。定义时要求 2 个参数,调用时只给了 1 个,会报 TypeError。
  3. 忘记 return。函数里算出了结果却没写 return,外面拿到的会是 None(空值),后续计算全错。
  4. 返回值没接住。写了 double(n) 却没有赋值给任何变量,等于算了一次就扔掉了。

八、小练习

练习 1:定义一个函数 max_of_three(a, b, c),返回三个数中的最大值,并打印 max_of_three(4, 19, 7) 的结果。

练习 2:在 Scratch 中制作一块「画星形」的自制积木,输入项为边长,内部重复 5 次:移动边长步、右转 144 度。想一想为什么是 144 度。

练习 3:下面代码的输出是什么? def add(a, b): a + b

print(add(3, 4))

参考答案: 练习 1: def max_of_three(a, b, c): m = a if b > m: m = b if c > m: m = c return m print(max_of_three(4, 19, 7)) # 输出 19

练习 2:五角星的外角是 180 - 108 = 72 度,用「右转 144 度」等价于画内角 108 度的尖角路径(144 = 360 - 216,也可理解为每次转两个外角),画出的是一个规整的五角星。

练习 3:函数里只有 a + b 而没有 return,返回值是 None,所以输出 None。正确写法是 return a + b,输出 7。

九、小结

函数的本质是「抽象」:把一段具体做法封装起来,用一个名字代替它。它带来三个好处——代码更短、逻辑更清晰、修改一处全局生效。当你发现脚本里有两段几乎一样的代码时,就是该把它变成函数的时候。这条经验在 Scratch、Python、C++ 里同样成立,也是所有编程语言共用的一条基本设计原则。