第 6 周:turtle 与第一阶段模拟
本周把前五周的知识用于纸面综合题,并学习 turtle 的常用函数和规则图形。重点不是画得多复杂,而是知道一条指令会让画笔怎样移动、转向和填充。
建议用时:8-10 小时,其中模拟与复盘约 2 小时。
本周目标#
学完本周,你应该能够:
- 识别 turtle 的三种导入方式。
- 使用移动、转向、抬笔、落笔和坐标函数。
- 根据正多边形外角计算每次转向角度。
- 使用循环画正方形、正三角形和正六边形。
- 正确设置画笔、填充颜色和线宽。
- 完成第一阶段 30 分钟限时模拟。
- 按知识点统计失分,并安排针对性重做。
6.1 turtle 是什么#
turtle 是 Python 标准库中的绘图模块。程序控制一只“海龟”在画布上移动:
- 落笔移动会留下线条。
- 抬笔移动不会留下线条。
- 前进时方向不变,只是位置改变。
- 左右转时位置不变,只改变朝向。
三种常见导入方式#
# 方式一:导入模块
import turtle
turtle.forward(100)
turtle.right(90)
# 方式二:给模块起短别名
import turtle as t
t.forward(100)
t.right(90)
# 方式三:导入全部名称
from turtle import *
forward(100)
right(90)
第三种写法调用时不用模块前缀,但阅读代码时不容易看出函数来源。基础练习可以使用,较大程序优先使用 import turtle,含义最清楚。
题目若已经规定导入方式,必须按题目的调用形式填空。例如使用 import turtle 后应写 turtle.forward(100),不能只写 forward(100)。
6.2 画布与基本移动#
import turtle
turtle.forward(100) # 向当前方向前进 100 像素
turtle.backward(50) # 向反方向后退 50 像素
turtle.left(90) # 向左转 90 度
turtle.forward(80) # 向新方向前进
turtle.right(45) # 向右转 45 度
turtle.done() # 保持窗口,结束绘制
要点:
- 前进和后退改变位置。
- 左右转改变朝向。
left()、right()的参数是角度,不是坐标。- 初始方向通常是向右,即朝向 0 度。
常用函数#
| 函数 | 作用 |
|---|---|
forward(distance) |
向前移动 |
backward(distance) |
向后移动 |
left(angle) |
左转 |
right(angle) |
右转 |
goto(x, y) |
移动到指定坐标 |
setheading(angle) |
设置绝对朝向 |
penup() |
抬笔,后续移动不画线 |
pendown() |
落笔,后续移动画线 |
pensize(width) |
设置线宽 |
pencolor(color) |
设置画笔颜色 |
fillcolor(color) |
设置填充颜色 |
color(pencolor, fillcolor) |
同时设置两种颜色 |
begin_fill() |
开始记录待填充区域 |
end_fill() |
结束并填充闭合区域 |
circle(radius) |
画圆或圆弧 |
dot(size) |
画实心圆点 |
write(text) |
写文字 |
speed(value) |
设置绘制速度 |
hideturtle() |
隐藏海龟图标 |
done() |
进入事件循环,保持窗口 |
6.3 方向和绝对坐标#
在默认 turtle 坐标系中:
- 原点
(0, 0)在画布中心。 - 正
x方向是右。 - 正
y方向是上。 - 朝向 0 度向右。
- 朝向 90 度向上。
- 朝向 180 度向左。
- 朝向 270 度向下。
import turtle
turtle.penup()
turtle.goto(-100, 0)
turtle.pendown()
turtle.setheading(90)
turtle.forward(100)
turtle.goto(100, 100)
turtle.done()
goto() 直接改变位置,不会自动按当前方向走直线。如果画笔落下,它会从当前位置向目标点画一条线。
setheading(0) 是绝对方向,right(90) 是相对当前方向转向。连续执行多次 right(90) 的效果会不断累积。
6.4 正方形#
正方形有四条边,每次向右转 90 度:
import turtle
for _ in range(4):
turtle.forward(100)
turtle.right(90)
turtle.done()
第一阶段的填空题常见形式:
for _ in range(4):
turtle.forward(100)
turtle.______(90)
填 right。画出四条边并回到起点,总共外角是 360 度,每次转 360 / 4 = 90 度。
6.5 正多边形的外角#
画正 n 边形并回到起点,需要绕行一整圈,外角和是 360 度:
每次转向角度 = 360 / n
| 图形 | 边数 | 每次右转角度 |
|---|---|---|
| 正三角形 | 3 | 120 |
| 正方形 | 4 | 90 |
| 正五边形 | 5 | 72 |
| 正六边形 | 6 | 60 |
| 正八边形 | 8 | 45 |
正三角形#
import turtle
for _ in range(3):
turtle.forward(120)
turtle.right(120)
turtle.done()
注意这里转向的是外角,不是三角形内角的 60 度。
正六边形#
import turtle
for _ in range(6):
turtle.forward(120)
turtle.right(60)
turtle.done()
6.6 画笔、颜色和填充#
import turtle
turtle.pensize(3)
turtle.color("blue", "lightyellow")
turtle.begin_fill()
for _ in range(6):
turtle.forward(120)
turtle.right(60)
turtle.end_fill()
turtle.hideturtle()
turtle.done()
color("blue", "lightyellow") 中:
- 第一个参数是画笔边框颜色。
- 第二个参数是填充颜色。
只传给 pencolor() 会设置线条颜色,只传给 fillcolor() 会设置填充颜色。
begin_fill() 和 end_fill() 之间的路径必须能围成闭合区域,才有预期的填充效果。正六边形最后一笔回到起点,所以路径闭合。
6.7 抬笔和落笔#
画两个分开的正方形:
import turtle
for _ in range(2):
turtle.penup()
turtle.forward(150)
turtle.pendown()
for _ in range(4):
turtle.forward(60)
turtle.right(90)
turtle.done()
抬笔只影响移动时是否画线,不改变方向。如果抬笔后转向,再落笔,新方向会保留。
6.8 圆、点和文字#
import turtle
turtle.circle(50)
turtle.penup()
turtle.goto(100, 0)
turtle.pendown()
turtle.dot(20, "red")
turtle.penup()
turtle.goto(-100, 100)
turtle.write("turtle", font=("Arial", 16, "normal"))
turtle.done()
circle(50) 默认从当前位置向左前方画圆,方向与直觉可能不同。考试若只要求填函数名,先根据参数和功能判断;自己绘图时可以小范围试验。
6.9 画五角星#
常见五角星每条线后转 144 度:
import turtle
turtle.color("red")
for _ in range(5):
turtle.forward(160)
turtle.right(144)
turtle.done()
144° 不是正五边形的外角 72 度,因为五角星走的是“隔一个顶点连接”的路径。图形类题目不要只套一个公式,要看运动轨迹。
6.10 turtle 常见错误#
- 使用
import turtle后忘记写turtle.前缀。 - 把
right拼成write。 - 用正多边形内角转向,导致图形不闭合。
penup()后没有pendown(),后续线条消失。begin_fill()后忘记end_fill()。- 路径没有闭合,填充区域不符合预期。
- 程序最后没有
done(),窗口可能立刻关闭。 - 循环次数和边数不一致。
- 每个图形都调用一次
done(),导致后续代码无法按预期继续。
6.11 第一阶段知识地图#
第一阶段不打开电脑,题目来自前六周:
| 模块 | 必须会的内容 |
|---|---|
| 类型转换 | int、float、str、bool |
| 运算符 | /、//、%、**、复合赋值 |
| 字符串 | 索引、切片、反转 |
| 列表 | 增加、删除、原地排序、新列表排序 |
| 字典 | keys()、values()、items()、zip() |
| 对象 | 类、__init__、self、属性 |
| 循环 | range、break、continue、累加 |
| 算法 | 最值、冒泡、选择、二分 |
| turtle | 正方形转向、常用函数 |
| 文件 | open 模式与 read() |
| 随机数 | randint(a, b) 的闭区间 |
文件读取填空的最小知识#
完整文件处理在第 7 周学习。第一阶段只需要先认识下面这种结构:
with open("data.txt", "r", encoding="utf-8") as f:
content = f.read()
这段代码的含义:
"data.txt"是文件名。"r"是只读模式。encoding="utf-8"指定文字编码。f.read()一次读出全部内容。with负责在代码块结束后自动关闭文件。
填空题若问“只读模式”填 "r",问“一次读完全部内容的方法”填 read。
6.12 第一阶段限时模拟#
现在完成第一阶段模拟题。
规则:
- 只用 30 分钟。
- 不打开电脑、不查讲义、不提前看答案。
- 所有推演写在纸上。
- 先完成有把握的题,再回来检查。
- 到时间立即停笔。
建议时间分配:
| 题型 | 建议时间 |
|---|---|
| 单项选择题 | 5 分钟 |
| 输出结果题 | 7 分钟 |
| 程序填空题 | 6 分钟 |
| 算法过程题 | 8 分钟 |
| 检查 | 4 分钟 |
6.13 评分与复盘#
做完后再打开参考答案与评分。
| 分数 | 下一步 |
|---|---|
| 24-30 | 达标,复盘错题后进入第 7 周 |
| 21-23 | 接近达标,重做错题并做一次同类变式 |
| 15-20 | 基础缺口明显,按知识点回看第 1-5 周 |
| 0-14 | 不要赶进度,先完成下面的一周重学计划 |
错题归因表#
不要只写“粗心”。按下面格式归类:
| 题号 | 正确答案 | 我的答案 | 错误类型 | 对应章节 | 重做日期 |
|---|---|---|---|---|---|
| 概念/推演/格式/未知 |
常见错误类型:
- 概念记错。
- 运算顺序错。
- 忘记方法会修改原列表。
- 切片终点多算一个。
- 循环轮次漏算。
- 排序算法过程混淆。
- turtle 转向角度错。
6.14 针对复盘的 30 分钟复习#
按顺序完成:
- 用 5 分钟重写
range()三种形式和切片规则。 - 用 5 分钟推演
a.sort()与sorted(a)的差异。 - 用 5 分钟写一个类并创建对象。
- 用 5 分钟手推冒泡排序一轮。
- 用 5 分钟手推二分查找一轮。
- 用 5 分钟写正方形、正六边形的转向角度。
复习完成后,不看答案重做模拟中的错题。如果同一道题仍然错,回到对应周的讲义,而不是只看答案。
6.15 专项练习#
A. 快速判断题#
- 画正方形每次向右转多少度?
- 画正六边形每次向右转多少度?
- 使用
import turtle后,前进函数怎么写? - 抬笔用哪个函数?
- 开始和结束填充分别用哪两个函数?
left(90)改变的是位置还是方向?goto(0, 100)是否一定按当前朝向移动?- 只读模式对应哪个字符?
- 一次读完全部文本的方法名是什么?
randint(1, 6)能否得到 6?
B. 编程题#
- 画边长 100 的正方形。
- 画边长 120、蓝色边框、浅黄色填充的正六边形。
- 用循环画三个并排且互不相连的正方形。
- 画一个正八边形,并说明转向角。
- 画一个红色五角星,边长 150。
- 用
goto和penup/pendown画两条不相连的水平线段。
6.16 练习答案#
A. 快速判断题答案#
- 90 度。
- 60 度。
turtle.forward(distance)。penup()。begin_fill()和end_fill()。- 方向。
- 不一定。它直接移动到指定坐标,画笔落下时会从当前位置画线到目标点。
"r"。read()。- 可以,
randint包含两端。
B. 编程题参考答案#
正方形:
import turtle for _ in range(4): turtle.forward(100) turtle.right(90) turtle.done()填充六边形:
import turtle turtle.color("blue", "lightyellow") turtle.begin_fill() for _ in range(6): turtle.forward(120) turtle.right(60) turtle.end_fill() turtle.done()三个并排正方形:
import turtle for _ in range(3): for _ in range(4): turtle.forward(60) turtle.right(90) turtle.penup() turtle.forward(80) turtle.pendown() turtle.done()正八边形:
import turtle for _ in range(8): turtle.forward(100) turtle.right(45) turtle.done()360 / 8 = 45度。五角星:
import turtle turtle.color("red") for _ in range(5): turtle.forward(150) turtle.right(144) turtle.done()两条水平线段:
import turtle turtle.penup() turtle.goto(-100, 50) turtle.pendown() turtle.goto(100, 50) turtle.penup() turtle.goto(-100, -50) turtle.pendown() turtle.goto(100, -50) turtle.done()
6.17 过关检查#
- 能说出三种 turtle 导入方式及其调用差异。
- 能解释前进、后退、左转、右转、位置和方向的差异。
- 能根据正多边形边数计算外角。
- 能独立画出正方形、正三角形、正六边形和五角星。
- 能正确使用画笔颜色、填充颜色、线宽和填充边界。
- 第一阶段模拟达到 24/30 分。
- 能按题号完成错题归因,而不是只抄答案。
- 同一错题在隔天后能够不看答案重做。
- 能认出只读文件打开方式和
read()填空。
如果本周模拟未达到 21 分,不进入第 7 周的新知识学习。先用 1-2 天重做第 1-5 周的基础练习,再重新模拟。