turtle绘图入门:120道题库教学指南与循环逻辑解析
简介Python海龟绘图turtle120道练习题Word文档专为Python入门教学与自学巩固设计适合教师课堂练习、学生课后编程实践。文档覆盖直线绘制、转向与角度控制、等边三角形、正方形、斜线、多边形等基础图形并详细解析使用forward、backward、right、left、home等命令的绘图思路兼顾循环结构训练由浅入深帮助读者掌握turtle库核心用法。压缩包内含1个docx文档大小2.58MB页面排版清晰方便打印或直接投影教学。资源已有1882人学习下载说明其受到一定认可。相比零散教程这份文档将120道题目、解析与参考代码集中呈现既可用于教师备课出题也可供学生对照练习还能进一步启发对颜色、填充、速度等扩展功能的探索提升编程逻辑与图形创作能力。1. 为什么一份120道的turtle题库值得当教学主线教Python入门最难的不是语法而是让学生相信for循环是偷懒工具。海龟绘图turtle标准库里的120道练习题恰好能解决这个“信任问题”从一条fd(100)开始到等边三角形、正方形、正五边形再到带对角线、梯形的组合图形每道题都在反复强调同一件事——顺序、循环和角度计算是图形程序的核心。这份整理成Word文档的题库给教师提供了一条清晰的备课线索也给学生留足了从跟练到自主设计的台阶。适合用来带Python基础语法课、做编程社团练习或者自己按章节刷一遍把turtle的底细彻底弄清楚。真正刷完这120题收获的不只是图形代码还有拆解问题、找重复模式的习惯。2. turtle基础命令与状态模型从fd到rt的底层逻辑2.1 海龟是一个自带状态的画笔turtle里的海龟不是普通光标而是一个持有位置、朝向、画笔颜色、画笔粗细以及画笔是否落下的对象。每次调用fd()、rt()都只是修改这个对象的状态fd(100)让海龟沿当前朝向移动100像素rt(30)让海龟的朝向增加30度且是顺时针方向。理解“所有移动都是相对海龟自身朝向而不是相对窗口坐标轴”这一点是后续所有绘图题的分水岭。很多初学者画图时习惯去“计算最终坐标”但turtle更自然的思考方式是“我下一步往哪走”而不是“我要走到坐标几”。import turtle as t t.fd(100) # 按当前朝向移动100像素初始朝向是右 t.rt(90) # 右转90度此时海龟朝下 t.fd(80) # 朝新方向走80像素 t.done() # 保持图形窗口不关闭fd是forward的缩写rt是right的缩写题库答案里大量使用缩写教师讲课时最好把全称写在注释里。done()的作用是进入事件循环让画布窗口保持显示如果缺少它在命令行直接运行脚本窗口可能一闪而过。在IDLE或Jupyter环境里即使不写done()通常也能看到结果但养成写done()的习惯可以避免换到其他运行环境后出问题。如果改用绝对坐标画三角形需要提前算好三个顶点的坐标再用goto()在点与点之间移动而用相对移动只需要重复“前进、转外角”两个操作。这也是turtle适合教循环的原因图形单元的重复性被暴露得非常直观学生能一眼看出“这一块代码在做同样的事”。2.2 命令缩写、负参数与坐标系细节命令缩写作用参数说明forwardfd向当前方向前进距离单位像素可为负数backwardbk向当前方向后退距离单位像素可为负数rightrt顺时针转向角度单位度可为浮点数leftlt逆时针转向角度单位度可为浮点数homehome回到原点并恢复初始朝向无参数fd(-100)等价于bk(100)rt(-90)等价于lt(90)这是新手经常忽略的负参数写法。原题第2题是fd(100)后立刻bk(100)再rt(30)走第二条线本质上就是连续改变位置和朝向。负参数在简单路径里看不出优势但在循环里通过变量控制方向时会很有用。这里不太建议为了“炫技”把题目答案统一改成负参数可读性会明显下降。turtle窗口的坐标原点在画布中心x 轴水平向右y 轴垂直向上海龟初始位置是原点初始朝向是0度即正右方向。如果之前画过 matplotlib 再玩 turtle会下意识去找横纵坐标轴但 turtle 里没有数据坐标轴的概念线条是否密集只取决于步长和角度累计误差并不会出现“横坐标太密集”这类控件层报错。2.3 三角形角度推导外角与内角的一次分叉等边三角形的每个内角是60度但海龟每次转向时转的是外角180减去60等于120度。原因是海龟从一条边进入下一条边它旋转的是“当前前进方向”到“下一条边前进方向”的夹角这个夹角在几何上正是三角形该顶点处的外角。如果转60度三条边画完后海龟朝向偏了60度位置也回不到起点图形无法闭合。import turtle as t for _ in range(3): t.fd(100) t.rt(120) t.done()range(3)让循环体执行三次每次完成“一条边加一次转角”。循环体内部的顺序很重要先前进再转角这样最后一次转角虽然让海龟多转了一下但不会在画布上留下多余线段海龟方向也能回到初始朝向。如果换成一个range(8)加上45度转角就能画出正八边形但如果把rt(120)改成rt(60)三条边后图形不闭合因为60度是内角不是外角。这个对比是让学生理解“外角公式”最好的实验素材。把“前进加转角”看作一个操作单元正三角形需要三个单元每个单元转120度总转角正好是3乘120等于360度。这个观察可以直接推广到任意正多边形也是第3章讨论的通用解法基础。3. 循环结构驱动几何图形从正方形到正五边形的通用化3.1 正方形与长方形循环体是“一条边一个角”正方形第一次出现在原题第4题题目同时给了“不用循环”和“使用循环”两个版本。对比看能直观理解循环存在的意义四条相同的边和四个相同的直角应该用一个循环而不是四段重复代码。循环体写成t.fd(100); t.rt(90)执行4次即可。正方形的外角是90度正好是360除以4的结果和三角形120度是360除以3的结果规律开始显现。import turtle as t for _ in range(4): t.fd(100) t.rt(90) t.done()这里用_作为循环变量表示“我不关心这个变量的值”是Python社区常用的写法。如果想把边长统一调整可以把100提取成变量side 100这样只需要改一处图形的所有边都会同步变化。对初学者来说从“常量”切换到“变量”是抽象思维的一次重要提升。长方形与正方形不同它的长和宽不一致不能直接套“边数等于4”的循环体因为循环单元变成了“一条长边加一条短边”。原题第9题给出了这种写法import turtle as t for _ in range(2): t.fd(120) t.rt(90) t.fd(60) t.rt(90) t.done()这个循环体画的是“一条长边加一条短边”执行两次正好回到起点。如果把它写成range(4)并在循环里判断奇偶不是不行但代码复杂度明显增加。所以循环设计的第一步不是纠结“循环转几次”而是找到重复的最小单元。在这里最小单元是“长边加转角加短边加转角”不是“单条边”。这道题能同时教两个知识点几何图形的分解以及循环变量并不总是用来计数的。3.2 正多边形通用公式外角360/n从三角形、正方形延伸到正五边形、正六边形任何正n边形的外角和都是360度因此每个外角是360除以n。五边形是72度六边形是60度八边形是45度。这个公式不仅好记更重要的是它让学生理解“多边形可以转一圈回到起点”不是巧合而是角度约束的必然结果。题库到第20题开始出现五边形时很多学生已经能猜出rt(72)这个答案因为他们发现了规律。边数 n外角 360/n图形3120等边三角形490正方形572正五边形660正六边形845正八边形import turtle as t n 6 side 80 for _ in range(n): t.fd(side) t.rt(360 / n) t.done()360 / n在Python 3中总是浮点数比如360除以6等于60.0turtle可以接受浮点角度。这个细节很重要如果把/改成//当n不能整除360时比如n等于7角度会被截断成整数517次循环的总转角变成357度图形无法闭合。这是整数除法的经典坑也是我建议学生必须亲自做一次的实验把n改成7分别用/和//跑一遍观察图形首尾是否衔接。当n继续增大到几十甚至上百正多边形看起来就是一个圆。turtle自带的circle(r)本质上就是用类似“小步前进、小角度转向”的方式逼近圆弧它内部根据半径和步长计算每次转角。在理解了外角公式之后再去看circle()的行为就很容易读懂它的设计意图而不是把它当成黑盒。3.3 嵌套循环与组合逻辑拆第11题的阶梯折线原题第11题是一条被分段的折线图形难度比单纯的正多边形高因为它不是重复“一条边”而是重复“一组边”。嵌套循环是解决这类题目的标准手段内层循环负责画出一组短边外层循环负责控制组与组之间的切换。import turtle as t for block in range(4): for step in range(3): t.fd(50) t.lt(90) t.rt(180) t.done()内层循环执行3次每次前进50并左转90度画出的是一个开口的“U”形轨迹内层结束后海龟朝向比进入内层前转了270度也就是左转了三下相当于右转90度。外层再执行rt(180)把朝向修正到下一组的方向。4组之后图形闭合回到起点。这里最容易犯的错误是内外层循环共用同一个变量名。原题答案里出现过for i in range(4)和内部for i in range(3)的写法虽然Python的range迭代器不依赖这个变量最终的值代码能跑通但阅读时很容易混淆稍有改动就可能引发隐蔽bug。我习惯用block和step区分层次并建议学生在草稿纸上把内层循环展开成3条普通命令先验证4组位置变化再压缩回循环写法。这个“循环展开法”是调试嵌套循环最实用的手段比对着屏幕猜状态快得多。如果把内层range(3)改成range(4)每组会变成一个完整正方形外层执行4次后得到4个重叠或错位的正方形如果把步长从50改成10线条会明显变密但不会有matplotlib那种坐标轴标签重叠的问题只是视觉上更拥挤。这类小修改非常适合用来做课堂提问让学生预测“改一个数字会怎样”。4. home()、undo()与角度补偿画“算不出长度”的边4.1 home()不只是回原点朝向复位才是关键原题第6、7、12、13、14、15题频繁要求使用home()它解决的实际困难是很多斜边长度不能用简单的整数距离直接表达手算又要开平方不如直接让海龟回家。home()会同时做两件事把位置移动到原点(0, 0)并且把朝向恢复为0度也就是正右方向。第二点经常被忽略但在多组图形连接时朝向复位比位置复位更容易影响后续代码。import turtle as t t.fd(80) t.rt(90) t.fd(60) t.home() # 从当前位置画一条直线回到原点 t.done()这段代码先向右走80右转90度后向下走60此时海龟停在坐标(80, -60)。home()会从当前位置自动画一条直线回到原点这条直线长度是100像素对应勾股数6-8-10但题目并不要求学生计算这个值。这就是home()的便利之处把“算不出来的边”交给海龟去补全。注意home()会正常画线因为默认画笔是落下的。如果只想让海龟回到原点而不留下线条需要先执行penup()再home()最后pendown()。很多学生在画辅助线时忘记抬笔导致图形里多出几条意外的斜线。这是我批改练习时看到过的高频错误。4.2 用pos()和heading()实时检查状态图形复杂度上来以后猜海龟位置没有意义直接打印状态是最快的排错方式。turtle提供了一套完整的状态查询API可以在任意位置插入print()观察当前坐标和朝向。下面这段代码演示了从折点回到原点的另一种解法比home()通用性更强因为它能回到任意指定坐标点。import turtle as t t.fd(80) t.rt(90) t.fd(60) print(当前坐标:, t.pos()) print(当前朝向:, t.heading()) d t.distance(0, 0) ang t.towards(0, 0) print(回原点距离:, d, 角度:, ang) t.setheading(ang) t.fd(d) t.done()pos()返回当前坐标的(x, y)元组heading()返回当前朝向的绝对角度0度向右90度向上180度向左270度向下。distance(x, y)计算从海龟当前位置到目标点的距离towards(x, y)返回海龟应该转向的绝对角度。最后用setheading(ang)直接设置绝对朝向再用fd(d)走到目标点。这套命令组合在手算斜边很麻烦时非常可靠缺点是计算出的距离往往是浮点数不如home()给得干脆。API作用返回示例pos()当前坐标(80.00, -60.00)xcor() / ycor()单独读取x或y坐标80.0heading()当前绝对朝向270.0distance(x, y)到目标点距离100.0towards(x, y)目标点的绝对角度-36.87setheading(a)设置绝对朝向无4.3 undo()与reset()撤回和清空的正确分工原题第16题的答案里出现了t.undo()这是一个容易讲漏的知识点。undo()撤销最近一条绘图命令并恢复海龟执行该命令之前的坐标和朝向相当于编辑器里的撤销操作。但它不是用来清空画布的画到一半想整体重来应该用reset()或clear()。import turtle as t t.fd(100) t.rt(90) t.fd(100) t.home() # 画一条对角线回到原点 t.rt(90) t.fd(100) t.undo() # 撤销上一步 fd(100)海龟回到原点 t.lt(90) t.fd(100) # 从原点补上另一边 t.done()这段代码来自原题第16题的“对角线正方形”思路。关键在于undo()之后海龟的位置和朝向都恢复到执行fd(100)之前的状态所以下一步lt(90)从原点转向继续画剩余边。如果这里误用clear()整个画布会被清空之前画的边全没了。clear()只清空图形海龟的状态保持不变reset()则把位置、朝向、画笔颜色、粗细全部恢复初始值。课堂演示时可以画一条线后分别执行undo()、clear()、reset()让学生观察海龟状态差异。注意undo()对填充和颜色变更同样会回退如果在begin_fill()和end_fill()之间使用填充状态可能错乱。这个边界问题很多资料不提实际用到了才觉得坑。5. 从120题到教学编排题库打标签、自动校验与创意扩展5.1 给题目打三层标签按课堂节奏释放拿到这120题不要从头讲到尾。以我自己的拆分习惯会先把已知题目分成三组第1到10题主要练直线、三角形、正方形和基本的home()第11到20题开始出现对角线、梯形、嵌套循环和undo()第21题往后覆盖五边形、正多边形公式以及自由组合构图。每组验收标准不同基础层要求能不看代码写出3条以上命令循环层要求能画出循环展开图综合层要求能提前算出一个新多边形的外角。训练层对应题号范围核心知识点验收方式基础命令层1-10fd/bk/rt/lt/home能解释每条命令改变的是海龟哪个状态循环与角度层11-20for循环、外角公式、undo能画出循环展开图并预测图形综合构图层21-120嵌套循环、对角线、梯形、正多边形能提前计算外角并独立验证5.2 自动校验用pos和heading给答案判分批改绘图题最耗时的是图形判断。一个务实的办法是在题目模板末尾追加自动校验代码只检查终点坐标和最终朝向不检查中间路径。对大多数“闭合图形”题目来说终点位置和朝向正确基本说明作图逻辑正确。import turtle as t # 学生代码区 t.fd(100) t.rt(90) t.fd(60) t.home() # 自动校验区 pos t.pos() heading t.heading() print(final pos:, pos) print(final heading:, heading) assert abs(pos[0]) 0.01, x坐标未回原点 assert abs(pos[1]) 0.01, y坐标未回原点 assert abs(heading % 360) 0.01, 最终朝向不是0度 print(pass) t.done()abs(pos[0]) 0.01是判断浮点坐标是否足够接近0的常用写法直接用容易因为浮点误差误判。heading % 360用于兼容海龟可能因为多转一圈而出现360度偏移的情况。学生代码写在注释之间教师可以用脚本批量替换不同题目的学生区统一执行后输出pass/fail统计120题的批改时间能压缩到几分钟。5.3 从结构化练习到创意扩展爱心代码里的参数化思维最后可以安排一个开放任务用turtle画爱心。这个经典题目看起来和120题无关实现原理却完全一致都是直线加角度组合。import turtle as t t.color(red) t.pensize(2) t.begin_fill() t.left(45) t.fd(100) t.circle(50, 180) t.right(90) t.circle(50, 180) t.fd(100) t.end_fill() t.done()circle(50, 180)表示以当前位置为起点画半径50、圆心角180度的弧。两个半圆拼出爱心上缘两段fd(100)拼出下尖。把半径改成其他值爱心胖瘦会变化学生能在反复调整中体会“参数控制形状”的思维。布置作业时可以让学生把爱心拆成“直线、半圆、角度”三个要素先画草图再写代码正好完成从照着画到自由设计的跨越。提示turtle是Python标准库不需要pip install。如果运行时报错提示找不到turtle优先检查当前选中的Python解释器版本而不是急着去安装第三方包。课堂演示换成t.exitonclick()替代t.done()点击窗口任意位置即可退出学生观察图形会更从容。本文还有配套的精品资源点击获取