教新指令:def · 机器人闯关
怎样教计算机一个新指令?
课程目录为什么需要它
小码只会几个指令,所以程序里总是出现同样的小组合:掉头要「左转、左转」,爬一级楼梯要写四行。函数 Function 给一组代码起一个名字,之后这个名字就像一个新指令,程序读起来就像在描述任务本身。
直觉理解
菜谱里写着「做酱汁(见第 12 页)」。「做酱汁」学一次,很多菜谱都能用。
def turn_around():
turn_left()
turn_left()def是定义 Define 的意思:「这里有一个新指令,叫 turn_around」。- 缩进的几行就是它要做的事。
- 定义它不会执行它。只有调用 Call 它的时候才会执行:
turn_around()。
Python 读到 turn_around() 时,会跳进函数里执行那几行,再回到调用处的下一行继续。
定义
函数 Function
A function is a named block of code that runs when it is called; def defines it.函数是一段有名字的代码,被调用时才执行;用 def 来定义。
调用 Call
To call a function is to run it by writing its name followed by parentheses.调用函数就是写出它的名字再加圆括号,让它执行。
示例
掉头
在互动课里运行第 1–3 行只是定义指令。看高亮在第 7 行时跳进函数里。
def turn_around():
turn_left()
turn_left()
move()
pick()
turn_around()
for i in range(4):
move()逐步执行
- L1Python 学会了新指令,小码还没动。
- L5程序从这里真正开始:向东一步。
- L6pick()……可是宝石还在前面一格!这个例子有个错误:在 pick() 前面再加一个 move()。
- L7(改好以后)调用会跳进函数……
- L2……执行两次左转……
- L8……再回来,向西走到旗子。
爬一级的指令
在互动课里运行现在循环读起来就像任务本身:爬一级,爬三次。
def climb():
move()
turn_left()
move()
turn_right()
for i in range(3):
climb()逐步执行
- L1定义 climb():四条指令合成一个名字。
- L8循环每一轮调用一次 climb()。
- L2进入函数:四条指令依次执行,然后回到循环。
常见错误
定义不等于执行
只写了 def ... 却没有调用,什么都不会发生。记得调用:climb()。
先定义,再调用
Python 从上往下读。在 def 之前调用 climb() 会报错,因为那时这个名字还不存在。
小测验
1. Python 读到 def turn_around(): 这一行时会发生什么?
查看答案
答案:B
def 只负责定义,函数体在每次被调用时才执行。
2. 小码最后停在哪里?
def go():
move()
move()
move()查看答案
答案:B
定义 go 并不会执行它。真正执行的只有最后一行:走一步。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出跳两下
预测小码最后停在哪里。
- 改需求下楼梯
climb()是上楼梯,这次的楼梯是往下的。只改函数里面的内容。 - 从零写去了再回来
小码从走廊中间出发。先捡东边的宝石,再掉头捡西边的宝石;旗子在最西边。定义
turn_around()和collect_to_wall(),3 张地图都要通关。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Function | 函数 | A named block of code that runs when it is called. |
| Define | 定义 | To create a function with def, giving its name and body. |
| Call | 调用 | To run a function by writing its name followed by parentheses. |