
Python标准库: turtle库, random库、time库
(一)turtle库概述
turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制。
turtle库绘制图形有一个基本框架:一个小海龟在坐标系中爬行,其爬行轨迹形成了绘制图形。对于小海龟来说,有“前进”、“后退”、“旋转”等爬行行为,对坐标系的探索也通过“前进方向”、“后退方向”、“左侧方向”和“右侧方向”等小海龟自身角度方位来完成。
使用import保留字对turtle库的引用有如下三种方式
第一种,import turtle,则对turtle库中函数调用采用turtle.<函数名>()形式。
#py10-1.py 例: 画园
import turtle #导入turtle库
'''
turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制。
'''
turtle.circle(90) #画园
第二种,from turtle import *,则对turtle库中函数调用直接采用<函数名>()形式,不在使用turtle.作为前导。
#py10-2.py 例: 画园
from turtle import *
turtle.circle(100) #画园
第三种,import turtle as t,则对turtle库中函数调用采用更简洁的t.<函数名>()形式,保留字as的作用是将turtle库给予别名t。
#py10-3.py 例: 画园
import turtle as pt
pt.circle(100)
pt.circle(120)
pt.circle(150)

(二 )turtle库与基本绘图
turtle库包含100多个功能函数,主要包括窗体函数、画笔状态函数、画笔运动函数等三类。
(1)窗体函数
turtle.setup(width, height, startx, starty)
作用:设置主窗体的大小和位置
参数:
width :窗口宽度,如果值是整数,表示的像素值;如果值是小数,表示窗口宽度与屏幕的比例;
height: 窗口高度,如果值是整数,表示的像素值;如果值是小数,表示窗口高度与屏幕的比例;
startx:窗口左侧与屏幕左侧的像素距离,如果值是None,窗口位于屏幕水平中央;
starty:窗口顶部与屏幕顶部的像素距离,如果值是None,窗口位于屏幕垂直中央;
(2)画笔状态函数
函数 | 描述 |
forward() | 沿着当前方向前进指定距离 |
backward() | 沿着当前相反方向后退指定距离 |
right(angle) | 向右旋转angle角度 |
left(angle) | 向左旋转angle角度 |
goto(x,y) | 移动到绝对坐标(x,y)处 |
setx( ) | 将当前x轴移动到指定位置 |
sety( ) | 将当前y轴移动到指定位置 |
setheading(angle) | 设置当前朝向为angle角度 |
home() | 设置当前画笔位置为原点,朝向东。 |
circle(radius,e) | 绘制一个指定半径r和角度e的圆或弧形 |
dot(r,color) | 绘制一个指定半径r和颜色color的圆点 |
undo() | 撤销画笔最后一步动作 |
speed() | 设置画笔的绘制速度,参数为0-10之间 |
turtle中的画笔(即小海龟)可以通过一组函数来控制,其中turtle.penup()和turtle.pendown()是一组,它们分别表示画笔的和落下,函数定义如下:
1)turtle.penup() 别名 turtle.pu(), turtle.up()
作用:抬起画笔,之后,移动画笔不绘制形状
参数:无
2) turtle.pendown() 别名 turtle.pd(), turtle.down()
作用:落下画笔,之后,移动画笔将绘制形状
参数:无
3)turtle.pensize()函数用来设置画笔尺寸
turtle.pensize(width) 别名 turtle.width()
作用:设置画笔宽度,当无参数输入时返回当前画笔宽度
参数:
width :设置的画笔线条宽度,如果为None或者为空,函数则返回当前画笔宽度。
4)turtle.pencolor()函数给画笔设置颜色
turtle.pencolor(colorstring) 或者 turtle.pencolor((r,g,b))
作用:设置画笔颜色,当无参数输入时返回当前画笔颜色
参数:
colorstring :表示颜色的字符串,例如:"purple"、"red"、"blue"等
(r,g,b): 颜色对应RGB的01数值,例如:1, 0.65, 0
画笔运动函数
(3)画笔运动函数
函数 | 描述 |
forward() | 沿着当前方向前进指定距离 |
backward() | 沿着当前相反方向后退指定距离 |
right(angle) | 向右旋转angle角度 |
left(angle) | 向左旋转angle角度 |
goto(x,y) | 移动到绝对坐标(x,y)处 |
setx( ) | 将当前x轴移动到指定位置 |
sety( ) | 将当前y轴移动到指定位置 |
setheading(angle) | 设置当前朝向为angle角度 |
home() | 设置当前画笔位置为原点,朝向东。 |
circle(radius,e) | 绘制一个指定半径r和角度e的圆或弧形 |
dot(r,color) | 绘制一个指定半径r和颜色color的圆点 |
undo() | 撤销画笔最后一步动作 |
speed() | 设置画笔的绘制速度,参数为0-10之间 |
1)turtle.fd()函数最常用,它控制画笔向当前行进方向前进一个距离
turtle.fd(distance) 别名 turtle.forward(distance)
作用:向小海龟当前行进方向前进distance距离
参数:
distance :行进距离的像素值,当值为负数时,表示向相反方向前进。
2)turtle.seth()函数用来改变画笔绘制方向
turtle.seth(to_angle) 别名 turtle.setheading(to_angle)
作用:设置小海龟当前行进方向为to_angle,该角度是绝对方向角度值。
参数:
to_angle :角度的整数值。
3)turtle.circle()函数用来绘制一个弧形
turtle.circle(radius, extent=None)
作用:根据半径radius绘制extent角度的弧形。
参数:
radius :弧形半径,当值为正数时,半径在小海龟左侧,当值为负数时,半径在小海龟右侧;
extent : 绘制弧形的角度,当不给该参数或参数为None时,绘制整个圆形。
例:
import turtle
turtle.pensize(2)
turtle.circle(10)
turtle.circle(40)
turtle.circle(80)
turtle.circle(160)
(二 )random库概述
使用random库主要目的是生成随机数。
这个库提供了不同类型的随机数函数,其中最基本的函数是random.random(),它生成一个[0.0, 1.0)之间的随机小数,所有其他随机函数都是基于这个函数扩展而来。
>>>from random import *
>>>random()
0.5780913011344704
>>>random()
0.20609823213950174
random库与随机数运用
函数 | 描述 |
seed(a=None) | 初始化随机数种子,默认值为当前系统时间 |
random() | 生成一个[0.0, 1.0)之间的随机小数 |
randint(a, b) | 生成一个[a,b]之间的整数 |
getrandbits(k) | 生成一个k比特长度的随机整数 |
randrange(start, stop[, step]) | 生成一个[start, stop)之间以step为步数的随机整数 |
uniform(a, b) | 生成一个[a, b]之间的随机小数 |
choice(seq) | 从序列类型(例如:列表)中随机返回一个元素 |
shuffle(seq) | 将序列类型中元素随机排列,返回打乱后的序列 |
sample(pop, k) | 从pop类型中随机选取k个元素,以列表类型返回 |
例: 生成随机数
#py10-10.py
'''
使用random库主要目的是生成随机数。
'''
import random as rd
for i in range(1,10):
a=rd.random()
b=int(a*100)
print(a,' ',b)
运行结果:
0.12120284395300707 12
0.6329775704697508 63
0.28004021885921604 28
0.9984020264029865 99
random库使用random.seed(a)对后续产生的随机数设置种子a。
>>>from random import *
>>>seed(10)
>>>random()
0.5714025946899135
>>>random()
0.4288890546751146
>>>seed(10) #再次设置相同的种子,则后续产生的随机数相同
>>>random()
0.5714025946899135
>>>random()
0.4288890546751146
设置随机数种子的好处是可以准确复现随机数序列,用于重复程序的运行轨迹。对于仅使用随机数但不需要复现的情形,可以不用设置随机数种子。
如果程序没有显式设置随机数种子,则使用随机数生成函数前,将默认以当前系统的运行时间为种子产生随机序列。
(三)time库概述
处理时间是程序最常用的功能之一,time库是Python提供的处理时间标准库。time库提供系统级精确计时器的计时功能,可以用来分析程序性能,也可让程序暂停运行时间。
>>import time
>>>time.localtime()
time.struct_time(tm_year=2022, tm_mon=1, tm_mday=18, tm_hour=12, tm_min=34, tm_sec=32, tm_wday=1, tm_yday=18, tm_isdst=0)
time库的功能主要分为3个方面:时间处理、时间格式化和计时。
时间处理主要包括4个函数:time.time()、time.gmtime()、time.localtime() 、time.ctime()。
时间格式化主要包括3个函数:time.mktime()、time.strftime()、time.strptime()。
计时主要包括3个函数:time.sleep()、time.monotonic()、time.perf_counter()
strftime()方法的格式化控制符
格式化字符串 | 日期/时间 | 值范围和实例 |
%Y | 年份 | 0001~9999,例如:1900 |
%m | 月份 | 01~12,例如:10 |
%B | 月名 | January~December,例如:April |
%b | 月名缩写 | Jan~Dec,例如:Apr |
%d | 日期 | 01 ~ 31,例如:25 |
%A | 星期 | Monday~Sunday,例如:Wednesday |
%a | 星期缩写 | Mon~Sun,例如:Wed |
%H | 小时(24h制) | 00 ~ 23,例如:12 |
%I | 小时(12h制) | 01 ~ 12,例如:7 |
%p | 上/下午 | AM, PM,例如:PM |
%M | 分钟 | 00 ~ 59,例如:26 |
%S | 秒 | 00 ~ 59,例如:26 |
#py10-11.py
'''
time库是Python提供的处理时间标准库。
'''
import time
t=time.localtime()
print(t)
t2=time.ctime(time.mktime(t))
print(t2)
lctime = time.localtime()
t3=time.strftime("%Y-%m-%d %H:%M:%S", lctime)
print(t3)
结果:
time.struct_time(tm_year=2022, tm_mon=1, tm_mday=18, tm_hour=12, tm_min=47, tm_sec=23, tm_wday=1, tm_yday=18, tm_isdst=0)
Tue Jan 18 12:47:23 2022
2022-01-18 12:47:23
例:
from datetime import datetime # 引用datetime 库
now = datetime.now() # 获得当前日期和时间信息
print(now)
now.strftime("%x") # 输出其中的日期部分
now.strftime("%X") # 输出其中的时间部分from
strptime()方法与strftime()方法完全相反,用于提取字符串中时间来生成strut_time对象,可以很灵活的作为time模块的输入接口。
>>> timeString = '2018-01-26 12:55:20'
>>> time.strptime(timeString, "%Y-%m-%d %H:%M:%S")
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=26, tm_hour=12, tm_min=55, tm_sec=20, tm_wday=4, tm_yday=26, tm_isdst=-1)
time库与程序计时
程序计时是非常常用的功能,尤其是对于运行时间较长的程序,往往需要先进行小规模(短时间)的实验,并根据实验结果预估最终程序的大致运行时间。
程序计时主要要包含三个要素:程序开始/结束时间、程序运行总时间、程序各核心模块运行时间。
下面以1千万次循环计时为例介绍程序计时的实现,并进一步理解time模块相关函数的运用。
例:以1千万次循环为主体,模拟实际程序的核心模块,用time.sleep()来模拟实际程序的其他模块。
#py10-12.py
'''
例:以1千万次循环为主体,模拟实际程序的核心模块,
用time.sleep()来模拟实际程序的其他模块。
'''
import time
def coreLoop():
limit = 10**8
while (limit > 0):
limit -= 1
def otherLoop1():
time.sleep(0.2)
def otherLoop2():
time.sleep(0.4)
def main():
startTime = time.localtime()
print('程序开始时间:',time.strftime('%Y-%m-%d %H:%M:%S', startTime))
startPerfCounter =time.perf_counter()
otherLoop1()
otherLoop1PerfCounter =time.perf_counter()
otherLoop1Perf = otherLoop1PerfCounter -startPerfCounter
coreLoop()
coreLoopPerfCounter = time.perf_counter()
coreLoopPerf = coreLoopPerfCounter - otherLoop1PerfCounter
otherLoop2()
otherLoop2PerfCounter = time.perf_counter()
otherLoop2Perf =otherLoop2PerfCounter - coreLoopPerfCounter
endPerfCounter =time.perf_counter()
totalPerf = endPerfCounter - startPerfCounter
endTime = time.localtime()
print("模块1运行时间是:{}秒".format(otherLoop1Perf))
print("核心模块运行时间是:{}秒".format(coreLoopPerf))
print("模块2运行时间是:{}秒".format(otherLoop2Perf))
print("程序运行总时间是:{}秒".format(totalPerf))
print('程序结束时间:',time.strftime('%Y-%m-%d %H:%M:%S', endTime))
main()
程序运行的输出效果如下:
程序开始时间: 2022-01-18 13:08:47
模块1运行时间是:0.20002106799999997秒
核心模块运行时间是:16.39944469秒
模块2运行时间是:0.3991994470000009秒
程序运行总时间是:16.998671687秒
程序结束时间: 2022-01-18 13:09:04
实例解析:雪景艺术绘图
turtle图形艺术,指利用turtle库画笔创造性绘制绚丽多彩艺术图形的过程。
turtle图形艺术效果中隐含着很多随机元素,如随机颜色、尺寸、位置和数量等。在图形艺术绘制中需要引入随机函数库random。常用randint()函数,生成指定范围内的随机数。
“雪景”图形艺术背景为黑色,分为上下两个区域,上方是漫天彩色雪花,下方是由远及近的灰色横线渐变。该图运用了随机元素,如雪花位置、颜色、大小、花瓣数目、地面灰色线条长度、线条位置等,需要使用turtle库和random库。
绘制分为三个步骤:
1、构建图的背景
2、绘制雪花效果
3、绘制雪地效果
第一步,构建图的背景
设定窗体大小为800x600像素,窗体颜色为black。然后,定义上方雪花绘制函数drawSnow()和下方雪地绘制函数drawGround()。
第二步,绘制雪花效果。
为体现艺术效果,drawSnow()函数首先隐藏turtle画笔、设置画笔大小、绘制速度,然后使用for循环绘制100朵雪花。雪花大小snowsize、雪花花瓣数dens都分别设定为一定数值范围随机数。最后通过for循环绘制出多彩雪花。
第三步,绘制雪地效果。
drawGround()函数使用for循环绘制地面400个小横线,画笔大小pensize、位置坐标x、y、线段长度均通过randint()函数作为随机数产生。
#py10-13.py
''' 雪景艺术绘图
SnowView.py
'''
from turtle import *
from random import *
def drawSnow():
hideturtle()
pensize(2)
for i in range(100):
r,g, b= random(), random(), random()
pencolor(r,g,b)
penup()
setx(randint(-350,350))
sety(randint(1,270))
pendown()
dens =randint(8,12)
snowsize = randint(10,14)
for j in range(dens):
forward(snowsize)
backward(snowsize)
right(360/dens)
def drawGround():
hideturtle()
for i in range(400):
pensize(randint(5,10))
x = randint(-400,350)
y = randint(-280,-1)
r,g, b = -y/280, -y/280, -y/280
pencolor((r,g,b))
penup()
goto(x,y)
pendown()
forward(randint(40,100))
setup(800,600,200,200)
tracer(False)
bgcolor("black")
drawSnow()
drawGround()
done()
运行结果:

主要讲解了3个重要的Python标准库:turtle、random和time,分别用于基本图形绘制、随机数运用和时间处理。再详细讲解各函数库功能基础上,通过雪景随机艺术画的绘制进一步帮助读者掌握这三个有趣且有用的标准库。
能够用Python绘图了,最想绘制的图形是什么?最想送给谁?
(四)数学库-math
math库中定义了一些常见的数学常量和数学计算公式,例如自然常数e,圆周率pi,正弦函数、对数函数、距离函数、平方根函数等。
方法 | 作用 |
sin(弧度)、cos(弧度) | 求某一弧度的正弦值、余弦值,此外还有正切、余切等。 |
radians(角度) | 将角度转化成对应的弧度 |
degrees(弧度) | 将弧度转化成对应的角度 |
dist(点p, 点q) | 获取两个点p和q之间的欧式距离,要求两个点的维度必须相同 |
fabs(浮点数) | 返回一个数的绝对值 |
factorial(整数) | 返回一个整数的阶乘,传递正整数,负数或小数时报错 |
方法 | 作用 |
ceil(浮点数) | 对浮点数进行向上取整,结果为大于等于参数值的最小整数 |
floor(浮点数) | 对浮点数进行向下取整,结果为小于等于参数值的最大整数 |
trunc(浮点数) | 对浮点数截取取整,直接忽略小数部分 |
pow(底数,指数) | 求幂,结果为底数的指数次方 |
log(x, 底数) | 返回 x 在指定底数下的对数,底数默认为自然常数e |
log2(x)、log10(x) | 返回 x 分别在底数为 2 和 10 时的对数 |
sqrt(浮点数) | 获取 浮点数 的平方根 |
gcd(整数x,整数y) | 获取两个整数的最大公约数 |
fsum(可迭代对象) | 对可迭代对象中的每个元素进行求和 |
prod(可迭代对象) | 将可迭代对象中的所有元素进行相乘 |
copysign(x, y) | 将 y 的符号复制给 x ,如果 x , y 同号,则 x 不变,否则 x = x * (-1) |
程序举例:
import math #调用函数前,导入模块
print(math.pi) # 打印圆周率
print(math.e) # 打印自然常数
print(math.sin(math.pi/6)) # 正弦函数
print(math.cos(math.pi/3)) # 余弦函数
print(math.tan(math.pi/4)) # 正切函数
print(math.dist((3, 4), (3, 1))) # 求距离
print(math.fabs(-10)) # 求绝对值
print(math.factorial(5)) # 求阶乘
print(math.ceil(-4.6)) # 向上取整
print(math.floor(-4.6)) # 向下取整
print(math.trunc(-4.6)) # 截取整数
print(math.pow(2, 3)) # 幂指数
print(math.gcd(12, 18)) # 最大公约数
print(math.fsum([1, 2, 3, 4, 5])) # 所有元素相加
print(math.prod([1, 2, 3, 4, 5])) # 所有元素相乘
print(math.copysign(-5, 10)) # 复制符号

