第9章:Python標準庫概覽
註明:本系列課程專為全國計算機等級考試二級 Python 語言程式設計考試服務
目錄
考綱考點
- 標準庫: turtle庫(必選)
- 標準庫: random庫(必選)、time庫(可選)
知識導圖
1、turtle庫概述
- turtle(海龜)是Python重要的標準庫之一,它能夠進行基本的圖形繪製
- turtle庫繪製圖形有一個基本框架:一個小海龜在座標系中爬行,其爬行軌跡形成了繪製圖形。對於小海龜來說,有“前進”、“後退”、“旋轉”等爬行行為,對座標系的探索也通過“前進方向”、“後退方向”、“左側方向”和“右側方向”等小海龜自身角度方位來完成。
- 使用import保留字對turtle庫的引用有如下三種方式
- 第一種,import turtle,則對turtle庫中函式呼叫採用 turtle.<函式名>() 形式。
import turtle
turtle.circle(200)
- 第二種,from turtle import *
from turtle import *
circle(200)
- 第三種,import turtle as t,則對turtle庫中函式呼叫採用更簡潔的 t.<函式名>() 形式,保留字as的作用是將turtle庫給予別名t。
import turtle as t
t.circle(200)
turtle庫與基本繪圖
- turtle庫包含100多個功能函式,主要包括窗體函式、畫筆狀態函式、畫筆運動函式等三類。
窗體函式
- turtle.setup(width, height, startx, starty)
作用:設定主窗體的大小和位置
引數:
width :視窗寬度,如果值是整數,表示的畫素值;如果值是小數,表示視窗寬度與螢幕的比例;
height::視窗高度,如果值是整數,表示的畫素值;如果值是小數,表示視窗高度與螢幕的比例;
startx:視窗左側與螢幕左側的畫素距離,如果值是None,視窗位於螢幕水平中央;
starty:視窗頂部與螢幕頂部的畫素距離,如果值是None,視窗位於螢幕垂直中央;
畫筆狀態函式
函式 | 描述 |
pendown() | 放下畫筆 |
penup() | 提起畫筆,與pendown()配對使用 |
pensize(width) | 設定畫筆線條的粗細為指定大小 |
color() | 設定畫筆的顏色 |
begin_fill() | 填充圖形前,呼叫該方法 |
end_fill() | 填充圖形結束 |
filling() | 返回填充的狀態,True為填充,False為未填充 |
clear() | 清空當前視窗,但不改變當前畫筆的位置 |
reset() | 清空當前視窗,並重置位置等狀態為預設值 |
screensize() | 設定畫布的長和寬 |
hideturtle() | 隱藏畫筆的turtle形狀 |
showturtle() | 顯示畫筆的turtle形狀 |
isvisible() | 如果turtle可見,則返回True |
- turtle中的畫筆(即小海龜)可以通過一組函式來控制,其中turtle.penup()和turtle.pendown()是一組,它們分別表示畫筆的和落下,函式定義如下:
turtle.penup() 別名 turtle.pu(), turtle.up()
作用:擡起畫筆,之後,移動畫筆不繪製形狀
引數:無
turtle.pendown() 別名 turtle.pd(), turtle.down()
作用:落下畫筆,之後,移動畫筆將繪製形狀
引數:無
- turtle.pensize()函式用來設定畫筆尺寸
turtle.pensize(width) 別名 turtle.width()
作用:設定畫筆寬度,當無引數輸入時返回當前畫筆寬度
引數:
width :設定的畫筆線條寬度,如果為None或者為空,函式則返回當前畫筆寬度。
- turtle.pencolor()函式給畫筆設定顏色
turtle.pencolor(colorstring) 或者 turtle.pencolor((r,g,b))
作用:設定畫筆顏色,當無引數輸入時返回當前畫筆顏色
引數:
colorstring :表示顏色的字串,例如:"purple"、"red"、"blue"等(r,g,b): 顏色對應RGB的01數值,例如:1, 0.65, 0
畫筆運動函式
函式 | 描述 |
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.fd()函式最常用,它控制畫筆向當前行進方向前進一個距離
turtle.seth()函式用來改變畫筆繪製方向turtle.fd(distance) 別名 turtle.forward(distance)
作用:向小海龜當前行進方向前進distance距離
引數:
distance :行進距離的畫素值,當值為負數時,表示向相反方向前進。
- turtle.seth()函式用來改變畫筆繪製方向
turtle.seth(to_angle) 別名 turtle.setheading(to_angle)
作用:設定小海龜當前行進方向為to_angle,該角度是絕對方向角度值。
引數:
to_angle :角度的整數值。
- turtle.circle()函式用來繪製一個弧形
turtle.circle(radius, extent=None)
作用:根據半徑radius繪製extent角度的弧形。
引數:
radius :弧形半徑,當值為正數時,半徑在小海龜左側,當值為負數時,半徑在小海龜右側;
extent : 繪製弧形的角度,當不給該引數或引數為None時,繪製整個圓形。
2、random庫概述
- 使用random庫主要目的是生成隨機數
- 這個庫提供了不同型別的隨機數函式,其中最基本的函式是random.random(),它生成一個[0.0, 1.0)之間的隨機小數,所有其他隨機函式都是基於這個函式擴充套件而來。
>>>from random import *
>>>random()
0.5780913011344704
>>>random()
0.20609823213950174
random庫與隨機數運用
- 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個元素,以列表型別返回 |
- random庫使用random.seed(a)對後續產生的隨機數設定種子a。
>>>from random import *
>>>seed(10)
>>>random()
0.5714025946899135
>>>random()
0.4288890546751146
>>>seed(10) #再次設定相同的種子,則後續產生的隨機數相同
>>>random()
0.5714025946899135
>>>random()
0.4288890546751146
- 設定隨機數種子的好處是可以準確復現隨機數序列,用於重複程式的執行軌跡。對於僅使用隨機數但不需要復現的情形,可以不用設定隨機數種子。n 如果程式沒有顯式設定隨機數種子,則使用隨機數生成函式前,將預設以當前系統的執行時間為種子產生隨機序列。
3、time庫概述
- 處理時間是程式最常用的功能之一,time庫是Python提供的處理時間標準庫。time庫提供系統級精確計時器的計時功能,可以用來分析程式效能,也可讓程式暫停執行時間。
>>>import time
>>>time.localtime()
time.struct_time(tm_year=2017, tm_mon=12,
tm_mday=2, tm_hour=14, tm_min=44, tm_sec=9,
tm_wday=4, tm_yday=26, tm_isdst=0)
- time庫的功能主要分為3個方面:時間處理、時間格式化和計時。
• 時間處理主要包括4 個函式: time.tiem ( ) 、time.gmtime()、time.localtime() 、time.ctime()。
• 時間格式化主要包括3個函式:time.mktime()、time.strftime()、time.strptime()。
• 計時主要包括3 個函式: time.sleep ( ) 、time.monotonic()、time.perf_counter()
- 使用time.time()獲取當前時間戳
>>>import time
>>>time.time()
1516939876.6022282
- 使用time.gmtime(secs)獲取當前時間戳對應的struct_time物件
>>> time.gmtime(now)
time.struct_time(tm_year=2018, tm_mon=1,
tm_mday=26, tm_hour=4, tm_min=11, tm_sec=16,
tm_wday=4, tm_yday=26, tm_isdst=0)
- 使用time.localtime(secs)獲取當前時間戳對應的本地時間的struct_time物件
>>> time.localtime(now)
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=26,
tm_hour=12, tm_min=11, tm_sec=16, tm_wday=4,
tm_yday=26, tm_isdst=0)
- 注意結果與gmtime的區別,UTC時間已自動轉換為北京時間。
- 使用time.ctime(secs)獲取當前時間戳對應的易讀字串表示,內部會呼叫time.localtime()函式以輸出當地時間。
>>> time.ctime(now)
'Fri Jan 26 12:11:16 2018'
- time庫使用time.mktime()、time.strftime()、time.strptime()進行時間格式化。
- 使用time.mktime(t) 將struct_time物件t轉換為時間戳,注意t代表當地時間。struct_time物件的元素如下
下標 | 屬性 | 值 |
0 | tm_year | 年份,整數 |
1 | tm_mon | 月份[1, 12] |
2 | tm_mday | 日期[1, 31] |
3 | tm_hour | 小時[0, 23] |
4 | tm_min | 分鐘[0, 59] |
5 | tm_sec | 秒[0, 61] |
6 | tm_wday | 星期[0, 6](0表示星期一) |
7 | tm_yday | 該年第幾天[1, 366] |
8 | tm_isdst | 是否夏時令,0否, 1是, -1未知 |
- 呼叫time.mktime(t)函式
>>> t = time.localtime(now)
>>> time.mktime(t)
1516939876.0
>>> time.ctime(time.mktime(t))
'Fri Jan 26 12:11:16 2018'
- time.strftime()函式是時間格式化最有效的方法,幾乎可以以任何通用格式輸出時間。該方法利用一個格式字串,對時間格式進行表達。
>>> lctime = time.localtime()
>>> lctime
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=0)
>>> time.strftime("%Y-%m-%d %H:%M:%S", lctime)
'2018-01-26 12:55:20'
- 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 |
- 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)
4、time庫與程式計時
- 程式計時是非常常用的功能,尤其是對於執行時間較長的程式,往往需要先進行小規模(短時間)的實驗,並根據實驗結果預估最終程式的大致執行時間。
- 程式計時主要要包含三個要素:程式開始/結束時間、程式執行總時間、程式各核心模組執行時間。
- 下面以1千萬次迴圈計時為例介紹程式計時的實現,並進一步理解time模組相關函式的運用。
- 以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()
- 程式執行的輸出效果如下
程式開始時間: 2017-12-26 13:46:39
模組1執行時間是:0.20003105182731706秒
核心模組執行時間是:5.987101639820927秒
模組2執行時間是:0.40018931343066555秒
程式執行總時間是:6.587323585324574秒
程式結束時間: 2017-12-26 13:46:45
5、例項解析:雪景藝術繪圖
- 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()函式作為隨機數產生。
# 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繪圖了,最想繪製的圖形是什麼?最想送給誰?