悄悄告诉你,Python 里面有一只小乌龟
摄影:产品经理
我一开始就说这杯酒有点少
众所周知,Python 生态里面有数不尽的第三方库。所以大家在写程序的时候,总是到处去寻找各种各样的第三方库。
但大家没有注意到的是,Python 官方自带的库里面,也藏着各种各样的宝贝。
今天我们介绍的是 Python 自带的turtle库。turtle 库的中文名叫做海龟绘图。是 Python 2.5开始引入的官方模块。很适合用来引导小孩学习编程。最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言。
要使用 turtle 库非常简单,只需要在 Python 中使用 import turtle导入即可:
>>> import turtle
turtle库是用来画图的一个库。现在我们来画一根直线:
>>> turtle.goto(100, 0)
运行完成以后,会自动弹出一个 tk 窗口,在窗口中,我们可以看到一根箭头。运行效果如下图所示:
其中,箭头的“三角形”就是“乌龟”(让我想到了真空中的球形鸡),直线就是我们刚刚画出来的线。这跟线长度是100像素。turtle.goto(x, y)这个方法,接收两个参数,第一个参数是横坐标,第二个参数是纵坐标。程序开始运行时,乌龟所在的位置为(0, 0)。
我们试一试再画一条线,让乌龟爬到(300, 400):
>>> turtle.goto(300, 400)
运行效果如下图所示:
我们可以看到,乌龟跑到每个坐标,都会拉出一条直线。能不能让乌龟移动都某个地方,但是不画线呢?此时我们可以使用turtle.penup(),先把画笔提起来,再移动乌龟既可。乌龟移动完成以后,使用turtle.pendown()重新把画笔放下,就可以继续画图了:
>>> turtle.penup()
>>> turtle.goto(-100, -150)
>>> turtle.pendown()
>>> turtle.goto(20, 10)
运行效果如下图所示:
我们可以使用turtle.home()让乌龟从当前位置爬回(0, 0),相当于turtle.goto(0, 0)。也可以使用turtle.clear()清空当前画布。
turtle.home()
turtle.clear()
现在我们综合使用一下上面的几个方法:
>>> turtle.penup()
>>> turtle.goto(-100, 100)
>>> turtle.pendown()
>>> turtle.goto(100, -100)
>>> turtle.penup()
>>> turtle.goto(-100, -100)
>>> turtle.pendown()
>>> turtle.goto(100, 100)
>>> turtle.penup()
>>> turtle.goto(120, 100)
>>> turtle.pendown()
>>> turtle.goto(150, 0)
>>> turtle.goto(180, 100)
>>> turtle.goto(150, 0)
>>> turtle.goto(150, -100)
运行效果如下图所示:
我们来玩点有趣的东西。既然可以通过坐标画直线,那么我们现在定义两个函数:
这两个函数对应的代码为:
import math
def fx(x):
return math.sqrt(2 * abs(x) - x ** 2)
def gx(x):
return -2.14 * math.sqrt(math.sqrt(2) - math.sqrt(abs(x)))
其中 x 的定义域为-2到2,但是由于图中是以像素为单位的,2像素显然太小了。所以我们把 x 和 y 都扩大100倍。
完整的代码如下:
import math
import turtle
def fx(x):
return math.sqrt(2 * abs(x) - x ** 2)
def gx(x):
return -2.14 * math.sqrt(math.sqrt(2) - math.sqrt(abs(x)))
up_part_point = []
down_part_point = []
for x in range(-20, 21):
x /= 10
y1 = fx(x)
y2 = gx(x)
up_part_point.append((100 * x, 100 * y1))
down_part_point.append((100 * x, 100 * y2))
turtle.penup()
turtle.goto(*up_part_point[0])
turtle.pendown()
for point in up_part_point:
turtle.goto(*point)
turtle.penup()
turtle.goto(*down_part_point[0])
turtle.pendown()
for point in down_part_point:
turtle.goto(*point)
turtle.done()
运行效果如下图所示:
除了上面的基本用法外,我们还可以修改颜色,让图片更好看,如下图所示:
或者画出更复杂的图片:
具体 API 可以阅读 turtle 的官方文档[1]
参考资料