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