查看全课大纲(第 14 / 51 节)
  1. 1.为什么人人都该学点编程?
  2. 2.计算机与程序设计:你的电脑到底在“想”什么?
  3. 3.Python 这门语言,到底有什么魔力?
  4. 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
  5. 5.如何安装一个更强大的代码编辑器?
  6. 6.汇率兑换1.0:你的第一个“钱生钱”小程序
  7. 7.你的第一行代码,藏着哪些秘密?
  8. 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
  9. 9.汇率兑换程序,如何让它“聪明”地判断币种?
  10. 10.汇率兑换程序能一直运行,直到我喊停吗?
  11. 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
  12. 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
  13. 13.怎么用 Python 画一个会动的五角星?
  14. 14.如何让程序自动画出不同大小的五角星?
  15. 15.函数自己调用自己,会发生什么?
  16. 16.用递归画出神奇的分形树
  17. 17.Python 怎么计算你一天躺着不动能消耗多少热量?
  18. 18.如何让程序“活”起来,持续为你服务?
  19. 19.如何让 BMR 计算器更“聪明”?
  20. 20.当程序遇到“不按套路出牌”的用户怎么办?
  21. 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
  22. 22.如何用列表记录每一周的存款?
  23. 23.如何让程序自己数数?—— 用 for 循环解放你的双手
  24. 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
  25. 25.52周存钱挑战:怎么根据日期自动查存款?
  26. 26.Python 怎么判断一年中的第几天?
  27. 27.列表 vs 元组:哪个更适合存储月份天数?
  28. 28.用集合给月份分个队,换个思路算天数
  29. 29.把月份和天数“锁”在一起:用字典给数据配个对
  30. 30.Python 怎么判断密码强弱?
  31. 31.Python 怎么给密码设置“防沉迷”系统?
  32. 32.Python 怎么把密码保存到文件里?
  33. 33.Python 怎么读取文件里的密码?
  34. 34.Python 怎么把密码检查工具“打包”起来?
  35. 35.Python 怎么把文件操作也“打包”起来?
  36. 36.计算机怎么“扔骰子”?——用Python模拟随机事件
  37. 37.如何用 Python 模拟掷两个骰子?
  38. 38.怎么用 Python 把骰子轨迹画出来?
  39. 39.骰子点数分布长啥样?用直方图一眼看穿!
  40. 40.用科学计算库让骰子程序“起飞”
  41. 41.空气质量指数怎么算?手把手教你写一个AQI计算器
  42. 42.空气质量指数计算:从零开始,让程序看懂空气
  43. 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
  44. 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
  45. 45.Python 怎么让程序自己判断文件类型?
  46. 46.如何让程序自己上网查空气质量?
  47. 47.用美味的汤来解析网页:Beautiful Soup 入门
  48. 48.如何让爬虫自动抓取全国所有城市的空气质量?
  49. 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
  50. 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
  51. 51.空气质量数据怎么“洗”干净,还能画成图?

如何让程序自动画出不同大小的五角星?

约 16 分钟

小象实战讲义 · Python 入门:8 个小项目边玩边学

上一节我们用 turtle 库画出了一个漂亮的五角星,是不是很有成就感?但程序员的天性就是“偷懒”——我们不想每次都手动改代码来画不同大小的五角星。这一节,我们就让程序自己动起来,像流水线一样,一口气画出从小到大、嵌套在一起的六个五角星!学完这一节,你的程序就拥有了“批量生产”图形的能力。

💡 核心导读

  • 本节只做一件事:在画五角星的程序里加入循环,让它自动重复绘制。
  • 你会学到:while 循环的基本用法,以及如何用函数让代码变得更清晰。
  • 一个实用技巧:+= 这种“偷懒”的写法,让你的代码更简洁。
  • 额外彩蛋:怎么控制画笔的颜色、粗细和起始位置,让你的图形更个性化。

回顾与目标:从“画一个”到“画一组”

还记得我们上一节的五角星代码吗?它只能画一个固定大小的五角星。如果我想画边长50、60、70……直到100的六个五角星,难道要复制粘贴六遍代码,然后手动改数字吗?

当然不!这太不“程序员”了。我们的目标是:写一段代码,让它自动循环执行“画一个五角星”这个动作,并且每次画的五角星都比前一个大一点。

思路很简单:把“画一个五角星”的代码包起来,告诉计算机:“这段代码,请你重复执行6次。不过每次执行前,记得把‘边长’这个数字增加10。”

第一步:给程序装上“循环发动机”——while

我们直接在上一节的代码上改造。首先,我们需要一个变量来记录当前五角星的边长,比如叫 size,初始值设为50。

然后,我们需要一个“发动机”,让代码重复跑起来。在Python里,while 循环就是这样一个发动机。它的基本逻辑是:“只要某个条件成立,就一直执行循环体内的代码。”

我们想让程序在 size 小于等于100的时候一直画,画完一次让 size 增加10。用 while 写出来就是这样:

import turtle

# 初始化画笔位置和样式(先抬笔移动,再落下开始画)
turtle.penup()
turtle.backward(200)  # 向左移动200像素,让起始点靠左一些
turtle.pendown()
turtle.pensize(2)     # 设置画笔粗细为2
turtle.pencolor('red') # 设置画笔颜色为红色

size = 50  # 五角星的起始边长

# 只要边长小于等于100,就继续画
while size <= 100:
    # 这里是原来画一个五角星的代码,我们稍后放进来
    # 画完之后,让边长增加10,准备画下一个
    size = size + 10

# 保持窗口,点击关闭

看,while size <= 100: 就是我们的发动机。只要 size 的值不超过100,它就会带着缩进在它下面的代码一遍遍地跑。

第二步:把“画一个星”的代码放进循环

现在,我们把画一个五角星的具体步骤填到循环里。画一个五角星需要:前进 size 步,右转144度,这个动作重复5次。

import turtle

turtle.penup()
turtle.backward(200)
turtle.pendown()
turtle.pensize(2)
turtle.pencolor('red')

size = 50

while size <= 100:
    # 开始画一个五角星
    count = 1  # 计数器,记录画了几条边
    while count <= 5:  # 画满5条边就停
        turtle.forward(size)  # 前进当前边长
        turtle.right(144)     # 右转144度
        count = count + 1     # 计数器加1,表示画完一条边
    # 一个五角星画完了
    size = size + 10  # 边长增加10,准备画下一个

运行一下这段代码,你会看到画笔从同一个起点,先画一个边长为50的小五角星,再画60、70、80、90、100 的——一共六个,一个比一个大。这里有个小秘密:五角星是闭合图形,每画完一颗,画笔刚好转过 720°(两整圈)回到起点、朝向也复原,所以这六颗星会共用同一个顶点、由小到大嵌套叠加在一起。看,程序自己“批量生产”了!(想让它们横向排成一串,得在每画完一颗后抬笔、向前移动一段距离再落笔——这正是下面“动手练一练”第 3 题的挑战。)

第三步:让代码更优雅——使用函数

上面的代码能工作,但看起来有点“乱”。尤其是循环里面又套了一个循环(画五角星的循环),逻辑层次不够清晰。如果我们能把“画一个五角星”这个功能打包成一个“黑盒子”,主程序只需要说“调用画五角星函数,传入边长50”,那就清爽多了。

这个“黑盒子”就是函数。我们来定义一个函数:

def draw_pentagram(size):
    """
    绘制一个五角星
    参数:size - 五角星的边长
    """
    count = 1
    while count <= 5:
        turtle.forward(size)
        turtle.right(144)
        count = count + 1

这个函数名叫 draw_pentagram,它接受一个参数 size。函数体内的代码和之前一模一样,只是 size 现在是从外面传进来的。

定义了函数之后,我们的主程序就变得超级简洁:

import turtle

def draw_pentagram(size):
    """
    绘制一个五角星
    参数:size - 五角星的边长
    """
    count = 1
    while count <= 5:
        turtle.forward(size)
        turtle.right(144)
        count = count + 1

# 主程序开始
turtle.penup()
turtle.backward(200)
turtle.pendown()
turtle.pensize(2)
turtle.pencolor('red')

size = 50
while size <= 100:
    draw_pentagram(size)  # 调用函数,画一个指定边长的五角星
    size = size + 10

看!主程序现在读起来就像一篇清晰的说明书:

  1. 准备画笔(抬笔、移动、落笔、设粗细颜色)。
  2. 边长从50开始。
  3. 只要边长不超过100,就:画一个这个边长的五角星,然后把边长加10。

至于五角星具体怎么画的细节,已经被封装在 draw_pentagram 函数里了。这就是结构化编程的魅力,让复杂的任务分解得井井有条。

第四步:程序员の“偷懒”技巧——复合赋值运算符

你发现了吗?我们代码里有两处 count = count + 1 和 size = size + 10。这种“自己等于自己加一个数”的写法非常常见,所以Python提供了一个简写:

  • count += 1 完全等价于 count = count + 1
  • size += 10 完全等价于 size = size + 10

+= 读作“加等”。同理,还有 -=(减等)、*=(乘等)、/=(除等)。用了它们,代码会更紧凑:

import turtle

def draw_pentagram(size):
    """
    绘制一个五角星
    参数:size - 五角星的边长
    """
    count = 1
    while count <= 5:
        turtle.forward(size)
        turtle.right(144)
        count += 1  # 使用简写

# 主程序部分
size = 50
while size <= 100:
    draw_pentagram(size)
    size += 10  # 使用简写

第五步:画笔控制小贴士

在今天的代码开头,我们用到了几个新的 turtle 函数来打扮我们的画笔:

  • turtle.penup():抬起画笔。抬起后移动,画布上不会留下痕迹。
  • turtle.pendown():落下画笔。落下后移动,才会开始绘制。
  • turtle.pensize(width):设置画笔的粗细。
  • turtle.pencolor(color_string):设置画笔颜色,传入颜色名字的字符串,如 'red', 'blue', 'green' 等。

它们的组合让我们实现了“先把笔挪到合适的位置,再开始作画”,避免了画出一条多余的移动轨迹。

turtle 库的功能非常丰富,比如还可以填充颜色、改变绘制速度、画圆点等等。我们不需要死记硬背所有函数,只需要知道,当你需要某个功能时(比如“我想画快点”),可以去查阅Python官方文档中关于 turtle 库的说明,搜索关键词如 speed 就能找到用法。


📝 动手练一练

  1. 颜色彩虹桥:修改今天的最终程序,让画出的每一个五角星颜色都不同。你可以定义一个颜色列表 colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple'],然后在循环中,每画一个五角星之前,都设置一次 turtle.pencolor()。
👉 点击查看参考答案

思路:在 while 循环中,除了控制 size,还需要一个索引来控制使用哪种颜色。我们可以使用 list(列表)来存储颜色,并通过索引依次取出。

import turtle

def draw_pentagram(size):
    count = 1
    while count <= 5:
        turtle.forward(size)
        turtle.right(144)
        count += 1

# 准备颜色列表
colors = ['red', 'orange', 'yellow', 'green', 'blue', 'purple']

turtle.penup()
turtle.backward(200)
turtle.pendown()
turtle.pensize(2)

size = 50
color_index = 0  # 颜色列表的起始索引

while size <= 100:
    # 设置当前画笔颜色
    turtle.pencolor(colors[color_index])
    # 画五角星
    draw_pentagram(size)
    # 更新边长和颜色索引
    size += 10
    color_index += 1
    # 如果颜色索引超出了列表范围,就回到开头(可选)
    if color_index >= len(colors):
        color_index = 0
  1. 大小反转:你能让程序从大到小画五角星吗?比如第一个边长是100,最后一个边长是50。

  2. 横向排开:现在六颗星是共用一个顶点、嵌套在一起的。你能让它们横向排成一串吗?提示:每画完一颗、画下一颗之前,用 turtle.penup() 抬笔、turtle.forward(距离) 向前挪一段、再 turtle.pendown() 落笔——抬笔移动时不会留下多余的连线。

👉 点击查看参考答案

第2题思路:只需要改变循环的初始条件、循环条件和更新语句。让 size 从100开始,只要 size >= 50 就继续循环,每循环一次让 size 减少10。

import turtle

def draw_pentagram(size):
    count = 1
    while count <= 5:
        turtle.forward(size)
        turtle.right(144)
        count += 1

turtle.penup()
turtle.backward(200)
turtle.pendown()
turtle.pensize(2)
turtle.pencolor('blue') # 换个颜色区分

size = 100  # 起始值设为100

while size >= 50:  # 条件变为大于等于50
    draw_pentagram(size)
    size -= 10     # 每次减少10

第3题思路(关键代码片段):在循环里画完一颗星、更新边长之间,插入「抬笔→前进→落笔」三步。注意每颗星画完画笔都回到了该颗星的起点,所以沿固定方向前进一段就能把下一颗的起点挪开:

import turtle

# 沿用上一步定义好的画星函数(每个答案块都自包含,方便直接运行)
def draw_pentagram(size):
    count = 1
    while count <= 5:
        turtle.forward(size)
        turtle.right(144)
        count += 1

size = 50
while size <= 100:
    draw_pentagram(size)
    turtle.penup()          # 抬笔:接下来的移动不画线
    turtle.forward(size + 20)  # 向前挪到下一个位置(间距你可以自己调)
    turtle.pendown()        # 落笔:准备画下一颗
    size += 10

(本块只演示“横向排开”的循环部分;draw_pentagram 已在块内重新给出,所以复制后可直接运行。)


本章小结

恭喜!你的图形编程技能升级了。现在你不仅能让 turtle 画画,还能指挥它按照你的规则(循环)自动画出一系列图形。

💡 本节要点回顾

  • while 循环:while 条件: 是让代码重复执行的“发动机”。只要条件为真,缩进在它下面的代码块就会一直运行。
  • 函数封装:把完成特定功能的一段代码(比如画五角星)定义成函数,能让主程序逻辑更清晰,代码也更易复用和维护。
  • 复合赋值:+=、-= 这些运算符是 a = a + b 的简写,让代码更简洁。
  • 画笔控制:penup()、pendown()、pensize()、pencolor() 让你能更精细地控制绘图过程。

📋 行动清单

学完立刻可以做的两件事:

  • 运行今天的最终代码,观察六个五角星由小到大、同顶点嵌套生长的绘制过程。
  • 尝试完成“动手练一练”:给五角星们换上彩虹色、试试从大到小,再挑战用抬笔/落笔把它们横向排开。

我们已经把循环和函数这两个强大的工具结合在了一起。但你可能感觉到了,主程序里依然有一个 while 循环在管理着 size 的变化。有没有可能把这个循环也“打包”起来,让程序的结构更进一步呢?这就是我们下一节要探索的奇妙概念——递归。准备好迎接思维上的小飞跃了吗?

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第3章代码包:分形树的绘制(含全部版本 4 个 .py)
    ZIP · 2KB
    下载
看图文没弄懂?展开看本节视频讲解(约 16 分钟)
📺 正在播放小象学院官方高清录播(支持倍速与清晰度调节)