Python標準ライブラリの概要
知識ポイント
- 標準ライブラリ: タートル ライブラリ (必須)
- 標準ライブラリ:ランダムライブラリ(必須)、タイムライブラリ(オプション)
ナレッジマップ
1. タートルライブラリの概要
- Turtle (タートル) は、Python の重要な標準ライブラリの 1 つで、基本的なグラフィック描画を実行できます。
- タートル ライブラリには、グラフィックスを描画するための基本的なフレームワークが含まれています。小さなタートルが座標系内を這い、その這う軌跡が描画グラフィックスを形成します。小型のカメの場合、「前進」「後進」「回転」などの匍匐行動があり、座標系の探索にも「前方向」「後方向」「左方向」「右方向」を利用します。「小さなカメ自身の角度と向きが完了するまで待ちます。
- import 予約語を使用して Turtle ライブラリを参照するには、次の 3 つの方法があります。
- 最初のインポート タートルは、turtle.<関数名>() の形式を使用して、タートル ライブラリ内の関数を呼び出します。
import turtle
turtle.circle(200)
- 2 番目のタイプは、turtle import * からのもので、turtle ライブラリの関数呼び出しに <関数名>() の形式を直接採用しており、リーダーとして Turtle. を使用しません。
from turtle import *
circle(200)
- 3 番目の import Turtle as t では、より簡潔な形式の t.<関数名>() を Turtle ライブラリの関数呼び出しに使用し、予約語の関数をそのまま使用して Turtle ライブラリにエイリアス t を与えます。
import turtle as t
t.circle(200)
1.1 タートルライブラリと基本的な描画
- タートルライブラリには、主にウィンドウ関数、ブラシ状態関数、ブラシモーション関数など、100 を超える関数が含まれています。
1.2 フォーム機能
- Turtle.setup(幅, 高さ, startx, starty)
役割: メインフォームのサイズと位置を設定します
パラメータ:
width : ウィンドウの幅、値が整数の場合はピクセル値を表し、値が 10 進数の場合は画面に対するウィンドウの幅の比率を表します。
height:: ウィンドウの高さ、値が整数の場合はピクセル値を表し、値が 10 進数の場合は画面に対するウィンドウの高さの比率を表します。
startx: ウィンドウの左側と画面の左側の間のピクセル距離。値が None の場合、ウィンドウは画面の水平方向の中央に位置します。
starty: ウィンドウの上部と画面の上部の間のピクセル距離。値が None の場合、ウィンドウは画面の垂直方向の中央に位置します。
1.3 ブラシステート機能
関数 | 説明する |
---|---|
ペンダウン() | ブラシを置きます |
閉鎖() | Pendown() と組み合わせてブラシを持ち上げます |
ペンサイズ(幅) | ブラシ線の太さを指定したサイズに設定します |
色() | ブラシの色を設定します |
begin_fill() | グラフを埋める前に、このメソッドを呼び出します |
end_fill() | 塗りつぶし形状の端 |
充填() | 塗りつぶしのステータスを返します。True は塗りつぶされ、False は塗りつぶされません。 |
クリア() | 現在のブラシの位置を変更せずに現在のウィンドウをクリアします。 |
リセット() | 現在のウィンドウをクリアし、位置とその他の状態をデフォルト値にリセットします。 |
画面サイズ() | キャンバスの長さと幅を設定する |
カメを隠す() | ブラシを隠す亀の形 |
ショータートル() | ブラシの亀の形を表示します |
見える() | タートルが表示されている場合は 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
1.4 ブラシ移動機能
関数 | 説明する |
---|---|
フォワード() | 現在の方向に指定された距離だけ進みます |
後方() | 現在の距離から反対方向に指定した距離だけ戻ります。 |
直角) | 右に角度回転 |
左(角度) | 角度だけ左に回転 |
goto(x,y) | 絶対座標(x,y)へ移動 |
setx() | 現在の X 軸を指定された位置に移動します |
セット( ) | 現在の Y 軸を指定された位置に移動します |
setheaded(角度) | 現在の方向を角度に設定します |
家() | 現在のブラシの位置を東向きの原点として設定します。 |
円(半径,e) | 指定された半径 r と角度 e の円または円弧を描画します |
ドット(r,カラー) | 指定された半径 r と色 color でドットを描画します |
元に戻す() | 最後のブラシ操作を元に戻す |
スピード() | ブラシの描画速度を設定します。パラメータは 0 ~ 10 です。 |
- Turtle.fd() 関数は最も一般的に使用され、現在の進行方向に一定距離進むようにブラシを制御します。
Turtle.seth() 関数は、ブラシの描画方向を変更するために使用されます。
機能: 小さなカメの現在の方向に距離を進めます。
パラメータ:
distance : 移動距離のピクセル値で、値が負の場合は逆方向に移動することを意味します。
- ブラシの描画方向を変更するには、turtle.seth() 関数を使用します。
Turtle.seth(to_angle) 别名 Turtle.setHeading(to_angle)
機能: 小さなカメの現在の進行方向を、絶対方向角度値である to_angle に設定します。
パラメータ:
to_angle : 角度の整数値。
- Turtle.circle() 関数は円弧を描くために使用されます。
Turtle.circle(半径、範囲=なし)
機能: 半径半径に従って範囲角度の円弧を描きます。
パラメータ:
radius : 円弧の半径。値が正の場合、半径は小さなカメの左側にあり、値が負の場合、半径は小さなカメの右側にあります。
extend : 円弧が描かれる角度。このパラメータが指定されていないか、パラメータが None の場合、円全体が描かれます。
2. ランダムライブラリの概要
- ランダム ライブラリを使用する主な目的は、乱数を生成することです。
- このライブラリはさまざまなタイプの乱数関数を提供します。最も基本的なものは [0.0, 1.0) の間のランダムな 10 進数を生成するrandom.random() であり、他のすべての乱数関数はこの関数に基づいています。
from random import *
print(random())
# 0.5780913011344704
print(random())
# 0.20609823213950174
2.1 ランダムライブラリと乱数の使用
- ランダムライブラリの共通機能
関数 | 説明する |
---|---|
シード(a=なし) | 乱数シードを初期化します。デフォルト値は現在のシステム時間です。 |
ランダム() | [0.0, 1.0) の間のランダムな小数を生成します。 |
randint(a, b) | [a,b] の間の整数を生成します |
ギザギザビット(k) | 長さ k ビットのランダムな整数を生成します |
randrange(開始、停止[、ステップ]) | step をステップ数として、[start, stop) の間のランダムな整数を生成します。 |
ユニフォーム(a, b) | [a, b] の間のランダムな小数を生成します |
選択(シーケンス) | シーケンス型 (例: リスト) から要素をランダムに返します。 |
シャッフル(連続) | 要素をシーケンス型でランダムに配置し、シャッフルしてシーケンスを返します。 |
サンプル(ポップ、k) | ポップタイプからランダムに k 個の要素を選択し、リストとして返します。 |
- ランダム ライブラリは、random.seed(a) を使用して、後続の乱数のシードを設定します。
from random import *
seed(10)
print(random())
# 0.5714025946899135
print(random())
# 0.4288890546751146
seed(10) #再次设置相同的种子,则后续产生的随机数相同
print(random())
# 0.5714025946899135
print(random())
# 0.4288890546751146
- 乱数シードを設定する利点は、プログラムの実行トラックを繰り返すために使用される乱数列を正確に再現できることです。乱数のみが使用され、繰り返しが必要ない状況では、乱数シードは設定されない場合があります。n プログラムが乱数シードを明示的に設定していない場合、乱数生成関数を使用する前に、デフォルトで現在のシステム実行時間が乱数シーケンスを生成するためのシードとして使用されます。
3. タイムライブラリの概要
- 処理時間はプログラムで最もよく使われる関数の一つで、時間ライブラリはPythonが提供する処理時間の標準ライブラリです。時間ライブラリは、システム レベルの正確なタイマーのタイミング機能を提供します。これを使用してプログラムのパフォーマンスを分析したり、プログラムの実行時間を一時停止したりすることもできます。
import time
print(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)'''
- 時刻ライブラリの機能は主に、時刻処理、時刻フォーマット、タイミングの 3 つの側面に分かれています。
• 時刻処理には主に time.tiem()、time.gmtime()、time.localtime()、time.ctime() の 4 つの関数が含まれます。
• 時刻のフォーマットには、主に time.mktime()、time.strftime()、time.strptime() の 3 つの関数が含まれます。
• 计时主要包括3 个函数: time.sleep ( ) 、time.monotonic()、time.perf_counter()
- 使用time.time()获取当前时间戳
import time
print(time.time())
# 1516939876.6022282
- 使用time.gmtime(secs)获取当前时间戳对应的struct_time对象
import time
print( time.gmtime(now))
'''
time.struct_time(tm_year=2020, 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对象
import time
print( time.localtime(now))
'''
time.struct_time(tm_year=2020, 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()函数以输出当地时间。
import time
print( time.ctime(now))
# 'Fri Jan 26 12:11:16 2020'
- 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)函数
import time
t = time.localtime(now)
print( time.mktime(t))
# 1516939876.0
print( time.ctime(time.mktime(t)))
# 'Fri Jan 26 12:11:16 2020'
- time.strftime()函数是时间格式化最有效的方法,几乎可以以任何通用格式输出时间。该方法利用一个格式字符串,对时间格式进行表达。
import time
lctime = time.localtime()
print( lctime)
'''
time.struct_time(tm_year=2020, tm_mon=1, tm_mday=26,
tm_hour=12, tm_min=55, tm_sec=20, tm_wday=4, tm_yday=26,
tm_isdst=0)
'''
print( time.strftime("%Y-%m-%d %H:%M:%S", lctime))
# '2020-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模块的输入接口
import time
timeString = '2020-01-26 12:55:20'
print( time.strptime(timeString, "%Y-%m-%d %H:%M:%S"))
'''
time.struct_time(tm_year=2020, 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() 関数は最初にタートル ブラシを非表示にし、ブラシ サイズと描画速度を設定してから、for ループを使用して 100 個の雪の結晶を描画します。雪の結晶の雪の大きさと雪の結晶の花びらの密集数は、それぞれ一定の値の範囲内の乱数として設定されます。最後に、for ループを通じてカラフルな雪の結晶が描画されます。
- 3 番目のステップは、雪のエフェクトを描画することです。
drawGround() 関数は for ループを使用して地面に 400 本の小さな水平線を描画します。ペンのサイズ、位置座標 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()
まとめ
今回は、Pythonの重要な標準ライブラリであるturtle、random、timeの3つを中心に説明しました。それぞれ基本的なグラフィックス描画、乱数応用、時間処理に使用されます。各関数ライブラリの機能を詳細に説明することに基づいて、雪景色のランダムなアートペインティングを介して、読者がこれら 3 つの興味深い便利な標準ライブラリを習得するのに役立ちます。
Python を使用して描画できますが、最も求められている描画は何ですか? 誰にあげたいですか?