查看全课大纲(第 14 / 51 节)
- 1.为什么人人都该学点编程?
- 2.计算机与程序设计:你的电脑到底在“想”什么?
- 3.Python 这门语言,到底有什么魔力?
- 4.Python 开发环境配置:如何拥有你的第一个“编程工具箱”?
- 5.如何安装一个更强大的代码编辑器?
- 6.汇率兑换1.0:你的第一个“钱生钱”小程序
- 7.你的第一行代码,藏着哪些秘密?
- 8.汇率兑换2.0(上):让程序看懂“CNY”和“USD”
- 9.汇率兑换程序,如何让它“聪明”地判断币种?
- 10.汇率兑换程序能一直运行,直到我喊停吗?
- 11.汇率兑换4.0:如何把“算钱”功能打包成积木?
- 12.汇率兑换5.0:给你的程序穿上“结构化”的西装
- 13.怎么用 Python 画一个会动的五角星?
- 14.如何让程序自动画出不同大小的五角星?
- 15.函数自己调用自己,会发生什么?
- 16.用递归画出神奇的分形树
- 17.Python 怎么计算你一天躺着不动能消耗多少热量?
- 18.如何让程序“活”起来,持续为你服务?
- 19.如何让 BMR 计算器更“聪明”?
- 20.当程序遇到“不按套路出牌”的用户怎么办?
- 21.怎么用 Python 模拟一个“滚雪球”式的存钱计划?
- 22.如何用列表记录每一周的存款?
- 23.如何让程序自己数数?—— 用 for 循环解放你的双手
- 24.52周存钱挑战4.0:你的存款计算器能有多灵活?
- 25.52周存钱挑战:怎么根据日期自动查存款?
- 26.Python 怎么判断一年中的第几天?
- 27.列表 vs 元组:哪个更适合存储月份天数?
- 28.用集合给月份分个队,换个思路算天数
- 29.把月份和天数“锁”在一起:用字典给数据配个对
- 30.Python 怎么判断密码强弱?
- 31.Python 怎么给密码设置“防沉迷”系统?
- 32.Python 怎么把密码保存到文件里?
- 33.Python 怎么读取文件里的密码?
- 34.Python 怎么把密码检查工具“打包”起来?
- 35.Python 怎么把文件操作也“打包”起来?
- 36.计算机怎么“扔骰子”?——用Python模拟随机事件
- 37.如何用 Python 模拟掷两个骰子?
- 38.怎么用 Python 把骰子轨迹画出来?
- 39.骰子点数分布长啥样?用直方图一眼看穿!
- 40.用科学计算库让骰子程序“起飞”
- 41.空气质量指数怎么算?手把手教你写一个AQI计算器
- 42.空气质量指数计算:从零开始,让程序看懂空气
- 43.如何读取空气质量数据文件并找出空气质量最好的五个监测点?
- 44.JSON 数据怎么变成 Excel 表格?—— 让数据换个“马甲”
- 45.Python 怎么让程序自己判断文件类型?
- 46.如何让程序自己上网查空气质量?
- 47.用美味的汤来解析网页:Beautiful Soup 入门
- 48.如何让爬虫自动抓取全国所有城市的空气质量?
- 49.爬到的数据怎么存下来?—— 把全国空气质量数据保存为CSV文件
- 50.用 pandas 玩转空气质量数据:找出全国空气最好和最差的城市
- 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看!主程序现在读起来就像一篇清晰的说明书:
- 准备画笔(抬笔、移动、落笔、设粗细颜色)。
- 边长从50开始。
- 只要边长不超过100,就:画一个这个边长的五角星,然后把边长加10。
至于五角星具体怎么画的细节,已经被封装在 draw_pentagram 函数里了。这就是结构化编程的魅力,让复杂的任务分解得井井有条。
第四步:程序员の“偷懒”技巧——复合赋值运算符
你发现了吗?我们代码里有两处 count = count + 1 和 size = size + 10。这种“自己等于自己加一个数”的写法非常常见,所以Python提供了一个简写:
count += 1完全等价于count = count + 1size += 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 就能找到用法。
📝 动手练一练
- 颜色彩虹桥:修改今天的最终程序,让画出的每一个五角星颜色都不同。你可以定义一个颜色列表
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大小反转:你能让程序从大到小画五角星吗?比如第一个边长是100,最后一个边长是50。
横向排开:现在六颗星是共用一个顶点、嵌套在一起的。你能让它们横向排成一串吗?提示:每画完一颗、画下一颗之前,用
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