12 周课程 / 第 6 周 9 分钟阅读

第 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 第一阶段限时模拟#

现在完成第一阶段模拟题。

规则:

  1. 只用 30 分钟。
  2. 不打开电脑、不查讲义、不提前看答案。
  3. 所有推演写在纸上。
  4. 先完成有把握的题,再回来检查。
  5. 到时间立即停笔。

建议时间分配:

题型 建议时间
单项选择题 5 分钟
输出结果题 7 分钟
程序填空题 6 分钟
算法过程题 8 分钟
检查 4 分钟

6.13 评分与复盘#

做完后再打开参考答案与评分。

分数 下一步
24-30 达标,复盘错题后进入第 7 周
21-23 接近达标,重做错题并做一次同类变式
15-20 基础缺口明显,按知识点回看第 1-5 周
0-14 不要赶进度,先完成下面的一周重学计划

错题归因表#

不要只写“粗心”。按下面格式归类:

题号 正确答案 我的答案 错误类型 对应章节 重做日期
概念/推演/格式/未知

常见错误类型:

  • 概念记错。
  • 运算顺序错。
  • 忘记方法会修改原列表。
  • 切片终点多算一个。
  • 循环轮次漏算。
  • 排序算法过程混淆。
  • turtle 转向角度错。

6.14 针对复盘的 30 分钟复习#

按顺序完成:

  1. 用 5 分钟重写 range() 三种形式和切片规则。
  2. 用 5 分钟推演 a.sort() 与 sorted(a) 的差异。
  3. 用 5 分钟写一个类并创建对象。
  4. 用 5 分钟手推冒泡排序一轮。
  5. 用 5 分钟手推二分查找一轮。
  6. 用 5 分钟写正方形、正六边形的转向角度。

复习完成后,不看答案重做模拟中的错题。如果同一道题仍然错,回到对应周的讲义,而不是只看答案。

6.15 专项练习#

A. 快速判断题#

  1. 画正方形每次向右转多少度?
  2. 画正六边形每次向右转多少度?
  3. 使用 import turtle 后,前进函数怎么写?
  4. 抬笔用哪个函数?
  5. 开始和结束填充分别用哪两个函数?
  6. left(90) 改变的是位置还是方向?
  7. goto(0, 100) 是否一定按当前朝向移动?
  8. 只读模式对应哪个字符?
  9. 一次读完全部文本的方法名是什么?
  10. randint(1, 6) 能否得到 6?

B. 编程题#

  1. 画边长 100 的正方形。
  2. 画边长 120、蓝色边框、浅黄色填充的正六边形。
  3. 用循环画三个并排且互不相连的正方形。
  4. 画一个正八边形,并说明转向角。
  5. 画一个红色五角星,边长 150。
  6. 用 goto 和 penup/pendown 画两条不相连的水平线段。

6.16 练习答案#

A. 快速判断题答案#

  1. 90 度。
  2. 60 度。
  3. turtle.forward(distance)。
  4. penup()。
  5. begin_fill() 和 end_fill()。
  6. 方向。
  7. 不一定。它直接移动到指定坐标,画笔落下时会从当前位置画线到目标点。
  8. "r"。
  9. read()。
  10. 可以,randint 包含两端。

B. 编程题参考答案#

  1. 正方形:

    import turtle
    
    for _ in range(4):
        turtle.forward(100)
        turtle.right(90)
    turtle.done()
    
  2. 填充六边形:

    import turtle
    
    turtle.color("blue", "lightyellow")
    turtle.begin_fill()
    for _ in range(6):
        turtle.forward(120)
        turtle.right(60)
    turtle.end_fill()
    turtle.done()
    
  3. 三个并排正方形:

    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()
    
  4. 正八边形:

    import turtle
    
    for _ in range(8):
        turtle.forward(100)
        turtle.right(45)
    turtle.done()
    

    360 / 8 = 45 度。

  5. 五角星:

    import turtle
    
    turtle.color("red")
    for _ in range(5):
        turtle.forward(150)
        turtle.right(144)
    turtle.done()
    
  6. 两条水平线段:

    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 周的基础练习,再重新模拟。

本周进度

完成讲义、练习和验收后再标记。