← 首页
00:00点开始
学情 用时 0′ 尝试 0 出错 0 归因 0
C 组织期 · 第二课
函数不只画图,还能算出数

上一课的函数只会动手画。今天的函数不画东西,只算一个数交回来。
交给谁?交给调用它的那一行。

开场 9 分钟怎么花: 回扣课24"定义 vs 调用"(3′)→ 抛"函数能给我个数吗"(3′)→ 发手帖 + 预告作品《让它交回来》(3′)。
老师说 交付用的是 return:算完,把结果交出去,函数当场结束。
t.forward(grow(i)) 的意思是:先让 grow(i) 交个数字出来,再用这个数字当前进长度。
第二十五种陷阱:算完忘了 return。 函数里写了 20 * k 但没交出去,调用处拿到的是 None—— t.forward(None) 立刻报 TypeError。算得对,但没交货。

第一步 · 不交货的陷阱 09′–23′ · 14 分钟 · 算对了却用不了

陷阱换了(第二十五种)
算完了,但没交回来
老师说 这段想让线一段比一段长:grow(1) 给 20、grow(2) 给 40……
先猜:按运行会发生什么?猜完再按。

盯住函数体:只算了一下,没有交货。
没有 return,调用处拿到的就是 None——不是 20。

老师纪律:别说"你忘写 return"。只问: 「grow(2) 到底交回了什么?把它打印出来看看。」——`None` 一出来他就懂了。

第二步 · 交付的规矩 23′–37′ · 14 分钟 · return 一执行,函数就结束

老师说 两条规矩:① return 后面写要交出去的东西;② return 一执行,函数立刻结束, 后面的代码都不跑了。
这和 print 完全不同:print 是喊给人听,return 是交给程序用。
这次 k
1
grow(k) 交回
20
这段多长
20
为什么坚持手推:"return 交回了什么"是抽象概念。 把每次调用的返回值写成一列,抽象就变成看得见的数字。
休息 1
37′–47′ · 10 分钟 · 站起来动一动
老师说 留个问题:如果 return 写在函数中间,后面的代码还会跑吗?
回来验证。

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

老师说 关掉运行。标准骨架的 for 跑了 5 遍。
在纸上写:这一遍 k 是几?grow(k) 交回几?这段画多长?
标准骨架:def grow(k): return 20 * k, 然后 for i in range(1,6): t.forward(grow(i)); t.left(90)。
人肉电脑的落点:学生要能说出「grow(i) 先算完, 把数交给 forward,forward 才动」——说不出这句,就是没懂调用的先后。

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

老师说 写一个会交回数字的函数,并用它决定前进长度。要求三条:
① 函数里有 return ② 返回值被 forward(...) 用上 ③ 长度每次都不同
巡场只问三句:函数交回了什么?交给谁用了? 每遍的返回值一样吗?
休息 2
85′–91′ · 6 分钟 · 伸个懒腰
老师说 回来改一处:把 return 20 * k 改成 return 10 * k + 10,看图形怎么变。

第五步 · 改数试试 91′–105′ · 14 分钟 · 改算式,图形怎么变

老师说 只改 return 后面那个算式:20 * k 改成 10 * k + 10。
先猜五段各多长,再运行。
这一步的收获:主程序 forward(grow(i)) 一个字没改, 只换算式,五段长度全变——函数把"怎么算"藏起来,用的人只管要结果。

第六步 · 读码迁移 105′–120′ · 15 分钟 · 读出每次交回几

老师说 最后 15 分钟不写新代码——读。这段的 return 有两个分支,说出每次交回几。
读码四步:① 函数有几种返回 → ② 每个分支什么时候走 → ③ 每次调用交回几 → ④ 画出来什么。
  • 填手帖:本课三问——函数交回什么 / 谁用这个结果 / 每遍一样吗
  • 家庭挑战:把《让它交回来》讲给爸妈听,说清 return 和 print 的区别
收尾话术(家长版): 「他今天学的是交付——算完要把结果交出去,别人才能用。 您可以问他:只算不 return 会怎样?他说得清,就是真懂。」

海龟的画布

(摆好卡片,按运行)

对应的 Python 代码 实时同步

本课硬事实 老师自查