海龟画图
一只按指令在平面上移动并留下痕迹的画笔;复杂图形被拆成相对运动,而不是一次性列出所有像素。
它是什么
海龟画图 把一只可以移动的「海龟」放在平面上。发出前进、后退、左转、右转的指令,它的笔若贴着纸,就会留下线段。复杂图形被拆成一连串相对运动,而不是一次性列出所有像素。这是一种几何的写法:位置与朝向是状态,指令是逐步改变状态的 程序。
import turtle
turtle.forward(80)
turtle.left(90)
turtle.forward(80)海龟是一套画图 模块,不是一种新的语法结构。循环、函数、递归 仍然用原来的写法,只是副作用画在了画布上。
名字从哪来
这个想法来自西摩·帕尔特(Seymour Papert)在 1960–70 年代与 Logo 语言一起做的工作。当时真的有一只机器人海龟在地上爬,背上的笔可以放下或抬起。屏幕上的三角形指针是它的后代。Python 标准库里的 turtle 模块,就是向 Logo 致敬的工具:用身体的朝向去理解转向,而不是一开始就要求掌握绝对坐标系里的每一个 。
海龟的朝向很重要:left(90) 是相对它自己的左边转,不是相对屏幕的绝对方位(除非另设朝向)。相对几何与坐标几何可以互相翻译,但思维方式不同。
它怎么工作
海龟有位置、朝向、笔是否落下、颜色和粗细这些状态。forward 沿当前朝向走;backward 沿反方向走;penup / pendown 控制是否留下痕迹。画一个字母 Y,通常是:向前画主干,左转画左枝并退回分叉点,再右转画右枝并退回,最后退回起点,把状态还原。「退回」常常被漏掉。漏了以后,下一笔会从错误的位置开始,图形看起来就散了。这和函数调用前后要保持环境干净,是同一类纪律。
画 分形 树时,海龟在每一层子树画完后都应当回到进入这层时的姿态,递归才能叠得整齐。绝对坐标画图(给定每一个点的 、)在分叉、回退这类图形上往往更长;海龟把「沿当前朝向走」收成一条短规则。
生活里在哪里
用尺子按口令画图:向前、转角、再向前。机器人在房间里带着朝向移动。刺绣或剪纸把同一套相对动作重复若干次。测绘与导航同样区分「相对本机转向」与「转到罗盘上的某一度」。把 left(30) 理解成转到罗盘 30 度,是把两种几何模型叠在了一起。
和相近概念的差别
海龟作图是模块提供的能力,不是 Python 语法的新分支。import turtle 之后图形不会自己出现,还要发出移动指令;没有落下的笔,移动也不留痕迹。递归描述如何把问题缩小;海龟提供缩小之后如何留下痕迹。二者常一起出现,但不是同一个概念。
常见误会
误会 1:left(30) 是转到罗盘上的 30 度。
默认是在当前朝向的基础上再转 30 度。
误会 2:画完左枝不必退回,反正下一句会右转。
海龟还停在左枝末端。不 backward,右枝就会接在错误的地方。
误会 3:import turtle 之后图形会自己出现。
还要发出移动指令。引入只是把工具准备好。见 模块。
想知道更多
- 书:艾伦·唐尼《像计算机科学家一样思考Python(第2版)》
- 书:布鲁克希尔《计算机科学概论》
- 书:埃里克·马瑟斯《Python编程:从入门到实践(第3版)》
未登录时不会保存学习进度