人人都能学编程
English 开始学习
课程 1 · 零基础入门第 9 课 / 共 10 课免费阅读

教新指令: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()
逐步执行
  1. L1Python 学会了新指令,小码还没动。
  2. L5程序从这里真正开始:向东一步。
  3. L6pick()……可是宝石还在前面一格!这个例子有个错误:在 pick() 前面再加一个 move()。
  4. L7(改好以后)调用会跳进函数……
  5. L2……执行两次左转……
  6. L8……再回来,向西走到旗子。

爬一级的指令

在互动课里运行

现在循环读起来就像任务本身:爬一级,爬三次。

def climb():
    move()
    turn_left()
    move()
    turn_right()

for i in range(3):
    climb()
逐步执行
  1. L1定义 climb():四条指令合成一个名字。
  2. L8循环每一轮调用一次 climb()。
  3. L2进入函数:四条指令依次执行,然后回到循环。

常见错误

定义不等于执行

只写了 def ... 却没有调用,什么都不会发生。记得调用:climb()。

先定义,再调用

Python 从上往下读。在 def 之前调用 climb() 会报错,因为那时这个名字还不存在。

小测验

1. Python 读到 def turn_around(): 这一行时会发生什么?

  1. A立刻执行两次转身
  2. B把这些指令记在这个名字下,留着以后用
  3. C报错
查看答案

答案:B

def 只负责定义,函数体在每次被调用时才执行。

2. 小码最后停在哪里?

def go():
    move()
    move()

move()
  1. A旗子上
  2. B离起点一格
  3. C离起点三格
查看答案

答案:B

定义 go 并不会执行它。真正执行的只有最后一行:走一步。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出跳两下

    预测小码最后停在哪里。

  2. 改需求下楼梯

    climb() 是上楼梯,这次的楼梯是往下的。只改函数里面的内容。

  3. 从零写去了再回来

    小码从走廊中间出发。先捡东边的宝石,再掉头捡西边的宝石;旗子在最西边。定义 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.