前面我们已经学完了Python的所有数据类型和程序的结构。从这节课开始,我们来学习Python的海龟库。
海龟(turtle)库中有一支神奇的画笔,从绘画窗的正中心开始,根据指令在画布上游走。我们可以自己控制画笔的方向、颜色、粗细,从而绘制出多彩的图形。我们从这节课开始讲turtle库中基本的函数使用,让我们也用python画出属于自己的一幅画吧。
一、了解笛卡尔坐标系和像素的概念
1.1笛卡尔坐标系
在使用海龟库画图的过程中,我们需要使用坐标来表示画布中一个点的位置。因此,我们需要对坐标系有一个初步的了解。在海龟库的画布中,我们使用的是笛卡尔坐标系,也叫平面直角坐标系。
两条数轴分别置于水平位置与垂直位置,取向右与向上的方向分别为两条数轴的正方向。水平的数轴叫做x轴(x-axis)或横轴,垂直的数轴叫做y轴(y-axis)或纵轴,x轴y轴统称为坐标轴,它们的公共原点O称为直角坐标系的原点(origin),以点O为原点的平面直角坐标系记作平面直角坐标系xOy。
在海龟库的画布中,画布的最中间的位置是坐标轴的原点。画布上任何一个点的位置,都可以使用坐标表示。表示方法为(x,y)。原点的坐标是(0,0)
上图中,A点的坐标是(3,2),B点的坐标是(-2,1),C点坐标是(-1,-2),D点坐标是(1,-3)。
1.2什么叫像素
我们都学过长度的单位,有米、分米、厘米、毫米等等。这些长度单位在我们电脑屏幕上是不适用的。为什么呢?因为我们每个人使用的计算机的屏幕大小都是不一样的。大到电视机,小到手机屏幕。
如果用厘米为单位,同样是向前10厘米对于电视机屏幕来说才走了一点点,对于手机屏幕来说已经不够用了。
计算机的显示器是由一个个方点组成的,每一个方点的长度叫做1像素(pixcel,简称px)。我们使用像素作为长度的单位。
二、如何导入海龟库
海龟(turtle)库是Python中的一个绘图用的函数库。在Python中导入一个库,需要使用import语句。导入海龟库的语句格式为:
importturtle
在程序中,要使用turtle.开头调用turtle库中的对象和方法。为了程序中书写简便,我们可以加上as语句定义一个别名。
importturtleast
使用了别名后,在程序中,只需要使用t.开头调用turtle库中的对象和方法。
还有一种调用方式,是直接调用库中所有的对象和方法,函数名称前不再需要写任何东西。
fromturtleimport*
三、基本画笔控制函数
我们先想一下,如果说给你一张纸和一支笔,画线条的时候你会有哪些操作?使用计算机画线条的操作基本上跟人类区别不大,无非就是落笔、抬笔、笔向前移动或者向后移动、转动方向。那我们看一下基本画笔控制的函数:
我们在画图时,画笔的位置位于坐标原点(画布的最中央),画笔的角度为水平向右,画笔是落笔状态。在画布中,我们可以看到海龟的箭头,箭头的位置就是当前画笔的位置,箭头指向的方向就是画笔当前的角度。
下面,我们来看看各种函数的具体使用吧。
3.1forward()函数
画笔向前移动一定的距离,使用方法:
turtle.forward(distance)
使用示例:
importturtleturtle.forward()turtle.done()
3.2backward()函数
画笔向后移动一定的距离,使用方法:
turtle.backward(distance)
使用示例:
importturtleturtle.backward()turtle.done()
3.3left()函数和right()函数
left()函数是画笔向左转一定角度,right()函数是画笔向右转一定角度,函数里的参数是角度。使用的方法一样:
turtle.left(angle)turtle.right(angle)
使用示例:
importturtleturtle.forward()turtle.left(90)turtle.forward()turtle.done()
importturtleturtle.forward()turtle.right(90)turtle.forward()turtle.done()
3.4goto()函数
goto()函数的作用是将画笔移动到指定的坐标。无论画笔当前转向什么角度,使用直线直接走到对应的坐标。使用方法如下:
turtle.goto(x,y)
这里的参数x和y表示坐标轴的坐标值。
使用示例:
importturtleturtle.goto(,)turtle.done()
3.5penup()和pendown()函数
看单词就可以看出,它们分别是抬笔和落笔。函数中没有任何参数。使用方法:
turtle.penup()turtle.pendown()
使用实例:
importturtleturtle.forward(50)turtle.penup()turtle.forward()turtle.pendown()turtle.forward(50)turtle.done()
四、画笔属性设置基本函数
前面我们虽然画出了线条,但是都是一根黑色的细线,如果想要更加美观,就得使用画笔属性设置的函数了。我们先学习三种基本的画笔属性的函数:
下面我们来看这几个函数的具体使用吧:
4.1pensize()函数
pensize()函数可以设置画笔的粗细,在未设置粗细的情况下,默认宽度为1,函数格式:
turtle.pensize(width)
我们看看具体的例子吧:
importturtleturtle.forward()turtle.pensize(10)turtle.forward()turtle.done()
4.2pencolor()函数
pencolor()函数可以设置画笔的颜色,在未设置的情况下,画笔默认颜色为黑色。函数格式:
turtle.pencolor(color)
这里的颜色目前阶段我们只要使用颜色英文单词的字符串就可以了。以后讲了颜色的高级设置以后还有更多的值可以写。我们看看具体的例子:
importturtleturtle.pensize(5)turtle.pencolor("d")turtle.forward()turtle.pencolor("blue")turtle.forward()turtle.done()
4.3speed()函数
speed()函数的作用是控制画图的速度,函数的格式为:
turtle.speed(speed)
参数speed的取值范围是0~10。最慢为1,随着数字变大,速度越来越快。有一个特殊的值:速度0为最快。
示例代码:
importturtleturtle.speed(1)turtle.forward(50)turtle.speed(10)turtle.forward(50)turtle.done()
大家可以复制代码运行试一下。代码运行的过程中注意观察画笔运行的速度。
五、turtle库的其他常用函数
5.1hideturtle()函数
我们前面在试各种函数时会发现,我们都图画完后,画笔还在屏幕上。如果最后生成一个作品,上面多一个画笔确实不好看。我们当然希望把它给隐藏了。只要使用hideturtle()函数就可以了。使用方法:
turtle.hideturtle()
5.2done()函数
前面的每一个例子中,我们都在使用它。最后我们讲一下它的作用:
暂停程序,停止画笔绘制,但绘图窗体不关闭,直到用户关闭PythonTurtle图形化窗口为止。使用方法:
turtle.done()
这个代码放在turtle画图的最后一行,如果后面还有代码将不会再运行。它最大的作用是阻止窗口关闭,大家可以试一下如果没有这一行,图画完后会怎样。
六、本节课函数应用实例演示
题目要求:使用turtle绘制一个边长为、线条宽度为5、线条颜色为绿色的等边三角形。
题目分析:等边三角形的三条边相等,内角是60°。我们先绘制一条线,内角是60°,那我们画笔要旋转°。线条的宽度和线条的颜色在绘图之前先设置好。
代码如下:
importturtleastt.pensize(5)t.pencolor("gen")t.forward()t.left()t.forward()t.left()t.forward()t.hideturtle()t.done()
以上代码可以按照题目的要求绘制出等边三角形了。但是我们想一下,三个边的操作都都是一样的,我们为什么不能用循环语句来书写呢?我们可以优化一下代码:
importturtleastt.pensize(5)t.pencolor("gen")foriinrange(3):t.forward()t.left()t.hideturtle()t.done()
七、课后思考题
1、绘制一个长为,宽为的长方形,线条宽度为4,长的线条为粉红色、宽的线条为紫色。
2、绘制一个五角星,每条线的长度为,线条宽度为2,线条颜色为橙色。
3、绘制两条长度为的线段,两条线的间隔为,上面一条线颜色为棕色、下面一条线颜色为*色,两条线的宽度都为10。
八、上节课思考题答案
1、参考答案:
sco=[(98,97,96),(79,98,97),(90,96,97),(99,90,92),(93,98,91),(98,99,97),(89,95,87),(97,67,89)]chinese=[]#语文成绩math=[]#数学成绩english=[]#英语成绩total=[]#总成绩foriinsco:chinese.append(i[0])math.append(i[1])english.append(i[2])total.append(sum(i))print("语文平均分:",sum(chinese)/len(chinese))print("语文最高分:",max(chinese))print("语文最低分:",min(chinese))print("数学平均分:",sum(math)/len(math))print("数学最高分:",max(math))print("数学最低分:",min(math))print("英语平均分:",sum(english)/len(english))print("英语最高分:",max(english))print("英语最低分:",min(english))print("每位同学的总成绩:",total)
2、参考答案:
foriinrange(2,):#先取以内的数字(range包前不包尾)forjinrange(2,i):#再取小于第一次取的数ifi%j==0:#第一次(较大)的数除以第二次(较小)的数bak#如果取余为0表示j是i的因子,舍去,结束本次i所在数的所有循环,用bakelse:print(i)#无法整除所有j,则无因子,符合质数的概念,输出
3、参考答案
a=int(input("第一个数:"))b=int(input("第二个数:"))#无法确定输入的数哪个大,先要判断大小ifab:xiao=ada=belse:da=axiao=bn=0#求和用foriinrange(xiao,da+1):#含头不含尾,大的数要+1ifi%3==0:continue#能被3整除的略过n+=iprint(n)