学径 LearnPath

编程语言基础 / Wiki

海龟画图

一只按指令在平面上移动并留下痕迹的画笔;复杂图形被拆成相对运动,而不是一次性列出所有像素。

它是什么

海龟画图 把一只可以移动的「海龟」放在平面上。发出前进、后退、左转、右转的指令,它的笔若贴着纸,就会留下线段。复杂图形被拆成一连串相对运动,而不是一次性列出所有像素。这是一种几何的写法:位置与朝向是状态,指令是逐步改变状态的 程序。

python
import turtle

turtle.forward(80)
turtle.left(90)
turtle.forward(80)

海龟是一套画图 模块,不是一种新的语法结构。循环、函数、递归 仍然用原来的写法,只是副作用画在了画布上。

名字从哪来

这个想法来自西摩·帕尔特(Seymour Papert)在 1960–70 年代与 Logo 语言一起做的工作。当时真的有一只机器人海龟在地上爬,背上的笔可以放下或抬起。屏幕上的三角形指针是它的后代。Python 标准库里的 turtle 模块,就是向 Logo 致敬的工具:用身体的朝向去理解转向,而不是一开始就要求掌握绝对坐标系里的每一个 (x,y)(x, y)。

海龟的朝向很重要:left(90) 是相对它自己的左边转,不是相对屏幕的绝对方位(除非另设朝向)。相对几何与坐标几何可以互相翻译,但思维方式不同。

它怎么工作

海龟有位置、朝向、笔是否落下、颜色和粗细这些状态。forward 沿当前朝向走;backward 沿反方向走;penup / pendown 控制是否留下痕迹。画一个字母 Y,通常是:向前画主干,左转画左枝并退回分叉点,再右转画右枝并退回,最后退回起点,把状态还原。「退回」常常被漏掉。漏了以后,下一笔会从错误的位置开始,图形看起来就散了。这和函数调用前后要保持环境干净,是同一类纪律。

画 分形 树时,海龟在每一层子树画完后都应当回到进入这层时的姿态,递归才能叠得整齐。绝对坐标画图(给定每一个点的 xx、yy)在分叉、回退这类图形上往往更长;海龟把「沿当前朝向走」收成一条短规则。

生活里在哪里

用尺子按口令画图:向前、转角、再向前。机器人在房间里带着朝向移动。刺绣或剪纸把同一套相对动作重复若干次。测绘与导航同样区分「相对本机转向」与「转到罗盘上的某一度」。把 left(30) 理解成转到罗盘 30 度,是把两种几何模型叠在了一起。

和相近概念的差别

海龟作图是模块提供的能力,不是 Python 语法的新分支。import turtle 之后图形不会自己出现,还要发出移动指令;没有落下的笔,移动也不留痕迹。递归描述如何把问题缩小;海龟提供缩小之后如何留下痕迹。二者常一起出现,但不是同一个概念。

常见误会

误会 1:left(30) 是转到罗盘上的 30 度。

默认是在当前朝向的基础上再转 30 度。

误会 2:画完左枝不必退回,反正下一句会右转。

海龟还停在左枝末端。不 backward,右枝就会接在错误的地方。

误会 3:import turtle 之后图形会自己出现。

还要发出移动指令。引入只是把工具准备好。见 模块。

想知道更多

  • 书:艾伦·唐尼《像计算机科学家一样思考Python(第2版)》
  • 书:布鲁克希尔《计算机科学概论》
  • 书:埃里克·马瑟斯《Python编程:从入门到实践(第3版)》

未登录时不会保存学习进度