当我们学习了第二课小猫跳舞后,对角色的添加与删除,背景的添加与删除。有了初步的了解,下面我们演示小猫猜生肖案例,对控制、侦测、运算、事件模块进行介绍!
这就是小猫猜生肖的基本界面设计,先添加一个背景,然后依次添加角色小猫、老鼠、小狗、猴子…
首先,为生肖大师小猫设计脚本:
1.用事件中积木开始整个程序。
2.用控制中积木开始一个循环。
3.用侦测中积木开始一个对话框。并把对话提示语改为“请问你的出生年份是多少?”
下面详细的介绍一下小猫是如何知道小朋友的生肖的:
大家都知道2018年是狗年,2018除以12的余数是2,那么可以推算出来,能被12整除的年份是猴年,余一的是鸡年、余二的是狗年、依次类推。为什么呢?三年级的小朋友都背过 子鼠、丑牛、寅虎、卯兔的生肖顺口溜吧。就根据咱们已经学到的知识。
上图就是咱们经常用到的控制积木中的积木块,是咱们设计的程序的大脑。
看这条语句判断你的输入符不符合实际情况。小朋友可能注意到了,否则 后面有两条语句,棕色的广播语句和紫色的说语句。广播语句是用于程序内部通信的,下面给大家展示一下小猴子角色的脚本。
是不是和广播的消息遥相呼应。好啦,小猫猜生肖用到的全部知识就介绍完了,想要知道小猫猜生肖的全部脚本或者有不明白的地方,可以联系老师哟!
趣味编程第3课-新年到!下雪了
一、任务描述
冬天来了,只见雪花纷纷扬扬地从空中飘下来。雪花落在小树上,小树好像穿上雪白的新衣。雪花落在屋顶上,屋顶好像戴上了雪白的帽子。雪花落在大地上,大地好像盖上了雪白的羊毛毯。要求用动画实现下雪的场景。
二、任务目的
1、让大家能够结合我们身边的事物来进行创作,巩固学习编程知识。
2、scratch中克隆体个数是有限的,不能无限制的克隆
3、学习私有变量的创建以及结合克隆体的使用。
4、面对某些不好实现的效果我们需要通过转换思维的办法来解决问题。
三、任务分析
1、初级挑战:只需要会使用克隆与随机数即可。在scratch中“克隆”与“当作为克隆体启动时”经常是配合使用,我们通过重复执行,来不断的克隆雪花。在每个克隆体启动时我们设置一下克隆体的大小和位置,然后再通过重复执行,改变克隆体的y坐标就实现了雪花下落效果。
2、中级挑战:要求雪花能够落在屋顶、车、路面。这里只要在雪花下落的过程中增加一个侦测的判断条件,只要克隆体碰到车或房子或者路面(路面用颜色来判断),就停止克隆体移动。
在scratch中克隆体的个数是有限的,你慢慢会发现,雪花会变得越来越少,为了不让雪停下来,我们使用“图章”把克隆的雪花留在舞台上,然后删除克隆体,这样就不会因为克隆体达到上限而停止了。
趣味编程第2课-小猫跳舞
当我们学习了第一课,小猫学步后,对Scratch有了初步的了解,本节课通过小猫跳舞程序的编制,给大家讲解Scratch中,角色的添加与删除,背景的添加与删除。不同角色拥有不同的脚本、背景、声音。
下面介紹一下Scratch的各个功能区块。
下面添加小猫跳舞的舞台,给小猫一个充分展示才艺的空间
小猫有舞台了,下面给小猫添加才艺,把命令积木中的才艺赋给小猫,跳舞、唱歌、弹奏乐器,甚至变脸等等才艺!
给小猫添加一个领跳,在美女小姐姐的指挥下,让小猫尽情的跳舞吧!
当然,也要给美女小姐姐赋予各种各样的才艺。
小猫跳舞就完成了,有什么疑问,加老师微信进行咨询吧!
趣味编程第1课-小猫学步
当我们已经安装好了软件。此时是全英文的,我们可以点击这个小宇宙切换成简体中文。所以一定要小朋友要好好学英语,这样我们就可以不用切换啦!
现在我们来介绍下Scratch软件每个区块的作用和名字,区块名字记不住没关系的,只要知道每个区块是做什么的就可以啦!
菜单-是我们保存文件和打开文件的地方;
控制按钮-小绿旗是开始,红色圆圈是停止;
工具箱-可以放大和缩小我们的角色;
舞台区-就是我们动画和游戏展示的地方;
新建角色按钮-我们可以建立我们自己喜欢的角色;
角色列表区-我们可以看到我们有哪些角色;
程序区块-是我们最重要的地方了,我们需要后面慢慢学习;
脚本区-是我们的做的程序。
通过这些枯燥的解释以后,我们就要进入后面的有趣环节了。
一只不会走路的小猫,要小朋友动脑筋来让它学会走路。
我们一起来看看最终我们要做成的样子,一只小猫咪在我们的编程下学会了走路。
是不是太棒啦!!!
首先我们添加动作,开始我们编程的第一步,『移动10步』。
可是,要不断的点击移动1步,移动1步,小猫咪才会行走,感觉是被老师拖着走的,不是自己在走的,而且老师点击的也有点点累了。
老师想让小猫咪自己走起了,不用老师每次去点击一次它才走一步,那么我们就要用一个很关键的程序部分了,那就是重复(循环)。就像我们学习一样要不断的重复才能记住。
小猫能一次走很远了,但是好像小猫的动作很不自然,下面我们就让小猫走的自然一点
好的这样我们的第一课『小猫学步』就完成了。现在小朋友可以在回到最开始看看我们的做的程序是不是和老师最开始的视频一样的效果。
如果不是看看是不是哪里有什么小问题,还是你又改进什么和新发现。
可以给老师留言哟!我们一起学习和进步。
儿童编程Scratch 赢在起跑线
Scratch是一种全新的程序设计语言,你可以用它很容易地创造交互式故事情节、动画、游戏,然后还可以把你的作品分享给所有人。开发者表示,这种电脑编程语言的目的,是帮助年轻人发展学习技能,学习创造性思维,以及学习集体合作。MIT(麻省理工学院)媒体实验室的博士生凯伦.布雷南,是Scratch项目的负责人,他说,“我们的目的不是要创办电脑程序编写大军,而是帮助电脑使用者表达自己。”
与其让孩子玩游戏;
不如让孩子做编程。
Scratch不是游戏,是一款可以制作游戏、动画的编程工具。一旦掌握了这个工具,孩子们就能自由自在地挥洒它们无限的创意,享受创造的乐趣。Scratch由麻省理工学院媒体实验室开发出来至今,全美有超过100万的孩子在学习Scratch。而在台湾,中小学生的信息化课就是以Scratch为主来上的,也有许多Scratch教学的网站。台湾教育部门每年都会举行程序设计比赛。台湾中小学的教育,通过Scratch,扩展了语文,数学,外语,音乐,体育,科学的教学深度。
科技使人类的生活发生巨大的变化。就当下的教育而言,孩子科技能力的重要性绝不亚于其他才艺和知识。
根据孩子上课的情况和效果,我们总结了Scratch三大好处。
1、学习Scratch可以培养逻辑思维能力。
在大年龄段孩子学习Scratch编程时,会涉及许多数学知识,孩子需要结合学校内学到的数学知识,来解决编程问题。因此,在不断探索的过程中,孩子们的数学知识也会越累越丰富,创作能力也越来越强。
2、学习Scratch可以提高学习的主动性。
在Scratch课堂上,我们鼓励孩子自己创作作品。在创作的过程中不仅习得了Science(科学),Technology(技术),Engineering(工程),Arts(艺术),Maths(数学)等多个领域的知识,而且也获得了成就感和满足感。定期校区举办Scratch分享会,让孩子们彼此体验他们自己编程的游戏,互相提出改进方法方式,这个过程大大激励了孩子的成就感和学习欲望。
3、学习Scratch可以激发创造力。
Scratch软件的优势是易学且功能强大,有助于孩子们发挥自己的想象力,而在动手创作过程中,他们的学习积极性、想象力和创造力会得到极大的锻炼。孩子们可以用Scratch中已有的素材,发挥自己的想象力制作游戏、动画,还可以自己设计素材。孩子只要敢想,在我们的指导下,就能完成他们心目中的游戏。
儿童编程和程序员的编程有什么区别?
归于一句话“孩子编程看兴趣,大人编程看薪水。”
儿童编程使用简易的编程软件进行编程思想和思维方式的锻炼,核心的理念是在把计算机编程融合孩子兴趣的同时,加强孩子思维能力的锻炼,在中国的大多数的儿童编程学习中,均将学科知识与编程知识相融合的方式进行授课教学。这在中国是有一定原因的:传统的中国式教育是以升学为目的的,只有将学科知识融入到编程学习中,家长才会乐于让孩子去接触。而成人的程序编程主要学的是程序语法的应用和实践,他主要偏向的是计算机编程的项目开发。
相对于在学校信息课上所学的知识来说,用于初学者教学,Scratch有以下这些优点:
1、入门简单,无关原有编程基础,适合中小学学生初次学习编程语言时使用;
2、内容丰富,针对有兴趣、喜爱绘画的学生,提供角色绘制设计功能;
3、通过使用Scratch,让学生在动画、游戏设计过程中逐渐形成逻辑分析、独立思考创新的思维方式,学会提出问题,解决问题;
4、相比其他编程软件,Scratch更加直观,学生能比较容易地看到自己的劳动成果。
学习编程最基本的是编程概念的掌握,Scratch以积木的形式进行编程,8个编程部件涵盖了常见的编程概念。学习编程最重要的是编程思想的培养,在程序学习中培养学生利用编程解决问题的能力。
学生在学会了编程的基本原理和方法后,会有兴趣也有能力将动画和游戏编写得更逼真,更好玩。在修改动画游戏脚本的过程中,学生不断提出问题,解决问题,根据自己的需求进行分析,设定合适的角色和相应的脚本,最终实现程序。
Python零基础快速入门趣味教程007-条件循环
条件循环能够让程序在条件成立时(即为真时)重复执行循环体中的语句。如果条件一直成立(即永远不会为假),则循环会一直进行下去,不会停止。如果初始时,条件不成立,则循环 1 次也不会执行。Python 中条件循环使用 while 关键字来实现。
看下面这段示例代码,
1 | import turtle |
函数 forward 实现的功能和原版的 turtle.forward 是一样的,但这里我们是借助条件循环来实现的。
第 5 行 turtle.speed(0) 设置海龟爬行的速度。速度的取值为 [0, 10]。当取值在 [1, 10] 之间时,数值越大,绘图的速度就越快。当取值为 0 时,海龟将以最快的速度绘图。这里,我们让海龟以最快的速度爬行。因为,在我们自定义的 forward 函数中(第 8-13 行),我们要让海龟移动很多步,但每次只移动 1 个很小的距离,为了尽快看到最终绘图的效果,我们得让海龟爬得快一些。
第 8 行 def forward(max_distance): 声明 forward 函数,它有 1 个参数 max_distance。这个函数要实现的功能是,让海龟一直爬行,直到海龟总的爬行距离达到(或超过) max_distance 时才停止爬行。
第 9 行 distance = 0 变量 distance 用于记录当前海龟已经累计爬行了多远的距离。初始时,海龟还没有开始爬行,因此 distance 的初始值为 0。
第 10 行 step = 1 设置海龟爬行的步长,即每 1 步要爬多远的距离。
第 11-13 行是用 while 语句实现的条件循环,其中第 11 行, while distance < max_distance: 指明了循环条件为 distance < max_distance 即,当海龟累计爬行距离 (distance) 小于规定的最大爬行距离 (max_distance) 时,执行循环体中的语句(第 12, 13 行)。
第 12, 13 行是循环体,其中第 12 行 turtle.forward(step) 让海龟以指定步长 step 前进一小段距离。第 13 行 distance += step 这是一种简写的形式,它等价于 distance = distance + step ,即将海龟刚才(第 12 行)爬行的那一小段距离累加到 distance 变量中。类似 for 循环,while 循环的循环体(第 12, 13 行)也要比 while 语句所在的行(第 11 行),向右缩进一些,通常我们用连续的 4 个空格来表示一级的缩进。
不过,现在的 forward 跟原版的 turtle.forward 效果是一样的,没啥意思,瓦力博士把代码改进一下,让它变得好玩一些。
1 |
|
再次运行程序,你会看到海龟在一条直线上折返爬行。
第 8 行 def forward(max_distance, max_radius): 我们为 forward 函数引入了一个新的参数 max_radius。后面,我们要实现的功能是当海龟离开原点的距离达到(或超过) max_radius 时,就调头往回爬,即往复爬行。
实现往复爬行对应的代码在第 12-14 行。
第 12 行 if turtle.distance(0,0) >= max_radius: ,其中 turtle.distance(0,0) 返回的是海龟与原点 (0, 0) 的距离。因此,当海龟与原点的距离达到或超过 max_radius 时,if 条件成立,程序将执行相应的语句(第 13, 14 行)。
第 13 行 angle = turtle.towards(0,0) ,其中 turtle.towards(0,0) 返回的是海龟朝向原点 (0, 0) 的角度。计算角度时,水平向右为 0 度,逆时针方向为角度增大的方向。
第 14 行 turtle.setheading(angle) 直接设定海龟的朝向,由于前面(第 13 行),将 angle 的值设置为海龟朝向原点的角度,所以这里经过 setheading 设置之后,海龟将朝向原点的方向。因此,后面再调用 turtle.forward (第 15 行),海龟就会往原点的方向移动,即往回爬行。
现在,海龟能够在一条直线上往复爬行,虽然比之前改进了一些,但还是显得比较单调。接下来,瓦力博士再进一步改进代码,让它变得更生动一些。
1 |
|
运行上面的代码,你会看到海龟随机地往返爬行。刚开始,你看不出什么规律,但等它爬行一段时间之后,你会发现海龟实际上是被限制在一个圆圈当中运动。
第 2 行 import random 导入 random 模块,用于生成随机数。
第 14 行 angle = turtle.towards(0,0) + random.randint(-45, 45) 其中的 random.randint(-45, 45) 用于产生 [-45, 45] 之间的随机整数,将这个随机整数加到朝向原点的角度上,这样海龟就不再精确地朝向原点,而是有一个随机波动的角度。因此,海龟就不再精确地按原路返回,从而摆脱直线的束缚。
但是,原来的 2 个约束依然存在:
海龟离开原点的距离不能超过 max_radius(第 13 行),所以它被限制在一个圆圈中运动
海龟总的运动距离不能超过 max_distance (第 12 行),所以它最终会停止运动
Python零基础快速入门趣味教程006-条件
前面的教程中,我们已经可以让小海龟绘制出各种图形了。但是,所有绘图的代码都是预先编好的,程序一旦运行起来,运行结果(绘制的图形)就是固定不变的。这一节中,瓦力博士将教大家如何让海龟响应用户的输入。1
2
3
4
5
6
7
8
9
10
11
12
13import turtle
def move():
direction = turtle.textinput('Input direction', 'Go left or right?')
if direction == 'left':
turtle.left(60)
turtle.forward(100)
if direction == 'right':
turtle.right(60)
turtle.forward(100)
move()
turtle.exitonclick()
程序运行起来之后,会先弹出一个输入框,询问你海龟的运动方向。你可以输入 left 或者 right。
当你按下 ok 按钮之后,海龟就会根据你的输入(left 或 right),相应地向左或向右运动。
这个例子中,程序的运行结果不完全取决于事先编写的代码,它还和你的输入有关。
第 5 行 direction = turtle.textinput(‘Input direction’, ‘Go left or right?’) 弹出一个输入框。输入框(窗口)的标题是 Input direction,输入框的提示文字为 Go left or right?。
当用户完成输入点击 ok 按钮时,变量 direction 将获得用户输入的值。
当用户点击 cancel 按钮时,变量 direction 的值为 None (None 为Python 中的关键字,表示什么也没有的意思)。
第 7, 8, 9 行称为条件语句。每个 if 语句(第 7 行)表示一个条件,它只有 2 种情况:要么成立(为真,值为 True),要么不成立(为假,值为 False)。
第 7 行 if direction == ‘left’: 对应的条件是判断变量 direction 与字符串 ‘left’ 是否相等。如果相等则执行第 8, 9 行的代码,否则就不执行第 8, 9 行的代码。
翻译成大白话就像下面这样1
2
3如果变量 direction 等于 left,则执行下面的语句
turtle.left(60)
turtle.forward(100)
所以,当用户输入 left,并点击 ok 按钮时,direction 接收到用户的输入 left,它的值等于 left,海龟就先向左转 60 度(执行第 8 行代码),再前进 100 个单位(执行第 9 行代码)。
要注意的是 Python 中比较 2 个东西是否相等,要用 == (即 2 个连续的等号),因为单独的 = (等号)在 Python 中表达的是将某个值赋值给某个变量的意思,因此,比较是否相等就得用另外的符号(即 ==)了。
另外,还要注意缩进,第 8, 9 行的代码要比 if 语句所在的行(第 7 行),向右缩进一些。这样 Python 才知道,当 if 语句为真时(即条件成立时),需要执行哪些代码。和瓦力博士在前面的教程中谈到的一样,我们一般用连续的 4 个空格符号来表示一级的缩进。
第 11, 12, 13 行也是条件语句,它们和第 7, 8, 9 行代码类似,只不过条件成立的条件改成了变量 direction 的值等于 right。
if 语句还有其他一些语法。下面,瓦力博士给大家展示的是 if … else 的语法。
1 | import turtle |
将 7-12 行的代码翻译成大白话就像下面这样,
1
2
3
4
5
6 如果变量 direction 等于 left,则执行下面的语句
turtle.left(60)
turtle.forward(100)
否则,执行下面的语句
turtle.right(60)
turtle.forward(100)
注意体会前后 2 个版本细微的差别。考虑用户输入一个既不是 left 也不是 right 的字符串(或者直接点击 cancel 按钮)。
前一个版本中,海龟不会发生运动。因为此时, if direction == ‘left’: 不成立, if direction == ‘right’: 也不成立,所有的绘图代码都没有机会执行。
后一个版本中,海龟会往右下方向运动。因为,后一个版本只检查 if direction == ‘left’: 是否成立。当该条件不成立时,不论变量 direction 的值是多少,它都会执行 else 对应的语句。
要实现和第 1 个版本一样的效果,我们可以用 if … elif 这样的语法。
1 | import turtle |
这个版本中,程序会依次,
先检查 if direction == ‘left’: (第 7 行)的条件,如果成立则执行相应的代码(第 8, 9 行),并忽略剩余的其他条件。如果不成立,则顺次检查下一个条件 if direction == ‘right’: (第 10 行)。
类似地,如果该条件成立,则执行相应的代码(第 11, 12 行),并忽略剩余的其他条件,否则再顺次检查下一个条件。
这样一直重复下去,直至没有可检查的条件为止。
虽然,第 3 个版本和第 1 个版本,最终呈现的效果是一模一样的,但它们的内部的执行过程,仍然有细微的差别。
第 1 个版本中,程序一定会检查条件 if direction == ‘right’: 是否成立,无论前一个条件 if direction == ‘left’: 是否成立。
最后一个版本中,程序只有在前一个条件 if direction == ‘left’: 不成立的时候,才会检查条件 if direction == ‘right’: 是否成立。
因此,虽然最终的效果是一样的,但从执行效率上来看,最后一个版本要略微高效一些。
Python零基础快速入门趣味教程005-参数
上一个教程中,瓦力博士带大家学习了函数的使用。例如,line_without_moving 函数,可以让海龟先画出一条线段,然后再回来起点。1
2
3def line_without_moving():
turtle.forward(100)
turtle.backward(100)
但是,这个函数还是有一些局限性的。譬如,海龟所画线段的长度是固定的,这样就显得不够灵活。那么有什么办法,让函数变得更灵活一些呢?答案就是使用参数。1
2
3def line_without_moving(length):
turtle.forward(length)
turtle.backward(length)
对比前后 2 段代码,新版的 line_without_moving 在函数声明的地方(第 1 行),在小括号里面写上了 length;又将函数体中(第 2, 3 行)的数字 100 替换成 length。这里的 length 就称为函数的参数,我们在函数调用时,可以向函数参数传递不同的值,这样函数体中用到 length 参数的地方,也就间接地用到我们提供的值啦。
1 | import turtle |
运行上面这段画十字型的代码,我们看到构成十字型的 4 条线段长短不一。这是因为我们在调用 line_without_moving 函数时,使用了不同的参数(第 9, 11, 13, 15 行)。
关于函数参数,瓦力博士要提醒大家的是,函数参数只能在本函数内部(即本函数体中)使用。函数之外,函数参数就无效了。例如,函数 line_without_moving 的参数 length 就只能在 line_without_moving 函数中使用,你不能在其他的地方使用它。
还记得上个教程中,瓦力博士给大家留的那个画蜂巢的作业吗?聪明的你,是不是已经画出来了呢?
下面是瓦力博士的代码,代大家参考。
1 | import turtle |
现在,蜂巢的大小的固定的。使用这节课的知识,通过函数参数,我们可以很方便地控制蜂巢的大小。
下面是瓦力博士改进后的代码。通过参数 size,我们可以自由地控制蜂巢的大小。
1 |
|
参数的传递过程如下:
第 14 行,我们在调用函数 honeycomb 时,将 80 传递给了 honeycomb 的参数 size
函数 honeycomb 接受了 80 这个参数值(第 8 行),因此函数 honeycomb 中,所有使用到参数 size 的地方(第 10, 11 行),都得到了 80 这个值
函数 honeycomb 中,又将 80 这个值传递给被调用的函数,第 10 传递给函数 hexagon, 第 11 行传递给函数 turtle.forward
函数 hexagon 接受了 80 个参数值(第 3 行),因此函数 hexagon 中,所有使用到参数 size 的地方(第 5 行),都得到了 80 这个值
……
这里,瓦力博士要提醒大家的是:函数 hexagon 和 honeycomb 中都有参数 size,这 2 个 size 虽然同名,而且在参数传递的过程中,都被赋予相同的值(80),但它们不是同一个参数!hexagon 中的参数 size,其作用域(即有效范围)是第 3-6 行;honeycomb 中的参数 size,其作用域是第 8-12 行。
练习
尝试编写一个带参数的函数,实现任意正多边形的绘制
提示
设计一个名为 draw_polygon 的函数来绘制任意正多边形
draw_polygon 接受 2 个参数 sides 和 length(多个参数之间用英文逗号分隔)
sides 用于控制正多边形的边数(内角)
length 用于控制正多边的边长(大小)
1 | def draw_polygon(sides, length): |
Python零基础快速入门趣味教程004-函数
什么样的程序员才是优秀的程序员?瓦力博士认为“慵懒”的程序员才是真正优秀的程序员。听起来不合逻辑?真正优秀的程序员知道如何高效地工作,而不是用不止境的加班来完成工作任务。函数便是程序员高效工作的利器之一。
事实上,在前面的教程中,我们已经在使用函数了。例如,我们在每段代码的最后,都会调用 turtle.exitonclick() 函数。exitonclick 函数的作用就是让海龟画完图像之后保持住,不要退出,直到我们点击窗口的时候 (onclick),才退出 (exit)。我们不需要知道函数 exitonclick 具体是怎样实现的,我们只需要在合适的地方调用它,使用它提供的功能就可以了。使用函数便是程序员高效工作的秘密(之一)。
那么,我们要如何定义自己的函数呢?
Python 中,我们使用 def 关键字来定义函数。请看下面这个例子:1
2
3def line_without_moving():
turtle.forward(100)
turtle.backward(100)
跟在关键字 def 之后的是函数名 line_without_moving。后面,我们就可以用 line_without_moving 这个函数名来调用它了。函数名之后,需要有一个冒号,告诉 python 接下来就是函数的具体内容(称为函数体)。
函数的功能就是通过函数体中的语句来实现的。注意到,函数体中的语句 (第2, 3 行) 和 def 所在的行 (第 1 行) 相比,要往右缩进了一些。Python 正是通过缩进来判断哪些语句是属于函数体中的语句(类似前面教程中谈到的,Python 用缩进来判断哪些语句属于循环体)。通常,我们用 4 个空格符来表示一级的缩进。
好了,让我们仔细看看 line_without_moving 的函数体(第 2, 3 行),看看这个函数实现的是什么功能? turtle.forward(100) 前进 100 个单位距离, turtle.backward(100) 后退 100 个单位的距离,这一进一退,小海龟又回到了原来的位置,这不等于啥也没干吗?No No No!海龟虽然又回到的原来的位置,但它在爬行过程中,会在屏幕上留下痕迹,即画出线条。因此,line_without_moving 这个函数的作用就是让海龟沿着当前方向绘制一条长度为 100 个单位的线条,然后还要回到起始的位置,同时保持龟头的方向不变。
上面的代码,仅仅是定义了函数 line_without_moving。光定义函数是看不到直接的效果的,函数需要被使用(即被调用),函数体中的代码才能被执行,我们才能看到效果。例如,下面的代码,我们在 line_without_moving 函数定义之后,调用了它(第 7, 9, 11, 13 行)。调用方式为函数名之后,跟一个小括号。这样,我们就能看到函数调用之后的效果了。
1 | import turtle |
运行上面的代码,我们可以看到一个十字型的图案。
类似循环可以嵌套一样,函数也可以嵌套。上面画十字型的代码,还可以改写成下面的形式。
1 | import turtle |
第 7-14 行,定义了一个新的函数 draw_cross。第 16 行,调用 draw_cross 函数画十字,而 draw_cross 函数内部又调用了 line_without_moving 函数(第 8, 10, 12, 14 行),即函数嵌套函数。
进一步观察,我们发现 8-14 行的代码有许多是重复的。第 8, 9 行的代码,重复了 4 次。结合前面瓦力博士讲的循环,聪明的你是不是已经想到了如何进一步简化代码了呢?下面是瓦力博士给出的参考代码,是不是和你想的一样呢?
1 | import turtle |
练习
提示
蜂窝是由一系列的正六边形构成的,先编写一个绘制正六边的函数,再通过多次函数调用的方式绘制出多个正六边形
设计正六边形函数的时候,要让海龟在画完正六边形之后,再次回到起始的位置,并保持龟头方向不变,这样方便我们拼接多个正六边形构成蜂窝的图案
在考虑如何用多个正六边形构成蜂窝时,请忽略绘制正六边形的细节(请忘记龟头转了几度,海龟前进了多少距离等细节 ),只需要知道海龟在绘制单个正六边形时的旋转方向(顺时针还是逆时针),并且海龟在绘制正六边形之后,会回到起始的位置,并保持龟头方向不变
在函数调用时忽略函数内部的细节,这事实上就是一种抽象的思维,函数不仅是程序员“偷懒”的工具,更是程序员通过抽象思维,实现复杂逻辑的利器。