← 首页
00:00点开始
学情 用时 0′ 尝试 0 出错 0 归因 0
C 组织期 · 第三课
函数分工:算的不管画,画的不管算

前两课一个函数又会算又会画,其实混在一起了。
今天把它们拆开:一个函数只干一件事。

开场 9 分钟怎么花: 回扣课25"return 交值"(3′)→ 抛"能不能一个算、一个画"(3′)→ 发手帖 + 预告作品《一个函数,一件事》(3′)。
老师说 grow(k) 只负责算出长度,draw(size, angle) 只负责画一段。
主程序负责把它们串起来——三段代码各管一件事,改哪段都不会牵连别的。
第二十六种陷阱:函数偷用外面的变量。 def grow(): return n * 2 看起来也能跑,但它依赖外面的 n—— 主程序一改 n,函数的行为跟着变,你在函数里根本看不出来它用了 n。

第一步 · 偷变量的陷阱 09′–23′ · 14 分钟 · 它到底用了谁

陷阱换了(第二十六种)
函数靠外面的变量算出结果
老师说 这段能跑,也画得出图形。先猜:graph 的大小由谁决定?猜完再运行。
然后我们只改主程序一个数,看它会不会跟着变。

盯住 def grow(): 的括号:空的。它没有参数, 用的是外面的 n。
看函数调用 grow(),你根本猜不出它要什么。

老师纪律:别说"参数写错了"。只问: 「grow() 里那个 n 是谁的?改主程序的 n,grow 的答案会变吗?」

第二步 · 分工的规矩 23′–37′ · 14 分钟 · 一函数一职责

老师说 两条规矩:① 要用的东西从参数进来,不偷外面的; ② 一个函数只做一件事——算就只算,画就只画。
这样调用处一眼就能看懂:draw(grow(i), 90) = 先算长度,再按它画。
这次 i
1
grow(i) 交回
20
累计转角
90°
为什么坚持手推:分工的好处只有在"追参数"时才看得见。 三列写出来,学生就能说出每个参数从哪来、到哪去。
休息 1
37′–47′ · 10 分钟 · 站起来动一动
老师说 留个问题:如果把 grow 里的 20 改成 30,图形会怎么变?draw 需要改吗?
回来验证。

第三步 · 人肉电脑 47′–65′ · 18 分钟 · 不许按运行

老师说 关掉运行。标准骨架 4 遍,每遍都调用两个函数。
在纸上写:这一遍 i 是几?grow(i) 交回几?draw 拿到哪两个参数?
标准骨架:def grow(k): return 20 * k;def draw(size, angle): forward(size); left(angle); 主程序 for i in range(1,5): draw(grow(i), 90)。
人肉电脑的落点:学生要能说出「draw 的两个参数一个来自 grow, 一个是写死的 90」——说不出就是没分清"算出来的"和"给定的"。

第四步 · 自己搭 65′–85′ · 20 分钟 · 写你自己的两个函数

老师说 写两个函数:一个只算(有 return),一个只画(调 turtle)。要求三条:
① 两个 def,各有分工 ② 算的那个只靠参数、不偷外面变量 ③ 画的被调用 ≥3 次
巡场只问三句:算的函数用到的数从哪来?画的函数改了会牵连算的吗? 主程序在干什么?
休息 2
85′–91′ · 6 分钟 · 伸个懒腰
老师说 回来只改一个数:把 grow 里的 20 改成 30,其余一个字不动。

第五步 · 改数试试 91′–105′ · 14 分钟 · 只改算的,画的不用动

老师说 只改一处:return 20 * k 改成 return 30 * k。
先猜:draw 需要改吗?图形会变成什么样?再运行。
这一步的收获:只改 grow 一处, draw 一个字没动,图形照样变——因为 draw 只认"传进来的数",不关心它从哪来。

第六步 · 读码迁移 105′–120′ · 15 分钟 · 读出谁干了什么

老师说 最后 15 分钟不写新代码——读。三个函数各干一件事,说出它们怎么串起来。
读码四步:① 有几个函数 → ② 各自职责 → ③ 谁调用谁 → ④ 画出来什么。
  • 填手帖:本课三问——每个函数干什么 / 参数从哪来 / 谁调用谁
  • 家庭挑战:把《一个函数,一件事》讲给爸妈听,说清为什么算和画要分开
收尾话术(家长版): 「他今天学的是分工——不是一个函数干得越多越好,而是每件事各归各的。 您可以问他:函数偷用外面的变量,会有什么麻烦?他说得清,就是真懂。」

海龟的画布

(摆好卡片,按运行)

对应的 Python 代码 实时同步

本课硬事实 老师自查