モジュールと標準ライブラリ

Pythonには膨大な組み込みツールが用意されています。乱数生成、数学演算、日付、ファイルパスなど、様々なものです。これらのツールはモジュールに存在し、importでコードに組み込みます。既にファイルと例外の章でimport jsonを使用しました。この章ではインポートについて完全に説明し、標準ライブラリの最も便利な部分を紹介します。
モジュールのインポート
最もシンプルなインポートは、モジュール全体を取り込み、ドット記法でその内容を使用できます。モジュールから特定の名前をインポートして、プレフィックスなしで直接使用することもできます。エイリアスは長い名前を短縮します。
import math
math.sqrt(16) # 4.0
math.pi # 3.141592653589793
math.floor(3.9) # 3
math.ceil(3.1) # 4モジュールから特定の名前をインポートして、直接使用できるようにします。
from math import sqrt, pi
sqrt(16) # 4.0("math."プレフィックスは不要)
pi # 3.141592653589793モジュールまたは名前にエイリアスを付けて短縮します。
import math as m
m.sqrt(16) # 4.0
from math import sqrt as square_root
square_root(25) # 5.0エイリアスは一般的なサードパーティライブラリで一般的です(import numpy as np、import pandas as pd)。標準ライブラリモジュールの場合は、完全な名前を使用することをお勧めします。コードがより読みやすくなります。
import mathはモジュール全体を取り込み、ドットで内側に到達します。math.sqrt(16)。from math import sqrtは1つの名前を取得し、プレフィックスを削除できます。asキーワードは長いインポートの名前を変更しますが、標準ライブラリのものについては完全な名前の方がより明確に読めます。 random
randomモジュールは乱数を生成し、ランダムな選択を行います。ゲーム、シミュレーション、ランダムサンプリング、予測不可能性が必要なその他の用途に使用します。シードを設定すると、結果が再現可能になります。同じシードは毎回同じシーケンスを生成します。
import random
random.random() # 0から1の間の浮動小数点数(0と1を除く)
random.randint(1, 10) # 1から10の整数(両端を含む)
random.uniform(1.0, 10.0) # 1.0から10.0の間の浮動小数点数
colours = ["red", "green", "blue"]
random.choice(colours) # 1つのアイテムを選択
random.choices(colours, k=3) # k個のアイテムを選択(復元あり)
random.sample(colours, k=2) # k個のアイテムを選択(復元なし)
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers) # インプレイスでシャッフル、Noneを返す再現可能な結果を得るために(テストとデータ科学に便利)、生成する前にシードを設定します。
random.seed(42)
random.randint(1, 100) # シード42では常に同じ値同じシードは毎回、任意のマシンで同じシーケンスを生成します。
random.choice()はリストから1つのアイテムを選択し、random.randint(1, 10)は範囲内の整数を与えます。端を含むです。すべての実行で同じ結果が必要ですか(たとえば、テストの場合)?random.seed()を最初に呼び出すとシーケンスがロックインされます。 math
mathモジュールは、数値の章で説明した基本算術演算子を超えた、より高度な数学演算を追加します。平方根、べき乗、対数、三角関数、piと無限大などの特殊な値がすべてここにあります。
import math
math.sqrt(25) # 5.0
math.pow(2, 10) # 1024.0(2 ** 10と同じですが常にfloatを返す)
math.log(100, 10) # 2.0(底が10の対数)
math.log(math.e) # 1.0(自然対数)
math.sin(math.pi / 2) # 1.0
math.cos(0) # 1.0
math.ceil(3.2) # 4
math.floor(3.9) # 3
math.trunc(3.9) # 3(正数の場合はint()と同じ)
math.inf # 無限大
math.isnan(float("nan")) # True
math.isinf(math.inf) # Truemathは+ - * /の先にあるすべてをカバーします。平方根、べき乗、対数、三角関数、および`math.pi`などの定数。計算が基本演算子より多くを必要とする瞬間に到達し、式を自分で書く必要をスキップします。 datetime
datetimeモジュールは日付と時刻を処理します。datetime.now()は現在の日付と時刻を返します。strftime()は文字列としてフォーマットします。strptime()は文字列を日時に解析します。timedeltaは加算または減算できる期間を表します。
from datetime import datetime, date, timedelta
now = datetime.now() # 現在の日付と時刻
today = date.today() # 現在の日付のみ
print(now.year, now.month, now.day)
print(now.hour, now.minute, now.second)
# フォーマット
print(now.strftime("%Y-%m-%d")) # "2024-01-15"
print(now.strftime("%d %B %Y, %H:%M")) # "15 January 2024, 09:42"
# 解析
deadline = datetime.strptime("2024-12-31", "%Y-%m-%d")
# 算術
tomorrow = today + timedelta(days=1)
next_week = today + timedelta(weeks=1)
diff = deadline - now
print(f"{diff.days} days until deadline")一般的なstrftimeコード:
| コード | 意味 | 例 |
|---|---|---|
%Y | 4桁の年 | 2024 |
%m | 月(ゼロパディング) | 01 |
%d | 日(ゼロパディング) | 15 |
%H | 時間(24時間) | 09 |
%M | 分 | 42 |
%B | 月の完全名 | January |
datetime.now()は現在の日付と時刻を提供します。strftime()は`%Y-%m-%d`などのコードで文字列に変換し、`strptime()`は逆に、文字列を解析して戻します。timedeltaは加算または減算できる期間なので、`today + timedelta(days=1)`は明日です。 os と pathlib
pathlibはファイルパスを操作する最新の方法です。Pathオブジェクトは、/演算子を使用してパスを構築、検査、ナビゲートできます。osはオペレーティングシステムへのアクセスと環境変数を提供します。新しいコードではpathlibを優先してください。
from pathlib import Path
p = Path("data/reports")
p.exists() # パスが存在する場合はTrue
p.is_dir() # ディレクトリの場合はTrue
p.is_file() # ファイルの場合はTrue
p.mkdir(parents=True, exist_ok=True) # ディレクトリを作成
for f in p.glob("*.csv"): # ディレクトリ内のすべてのCSVファイル
print(f.name) # ファイル名
report = p / "report_jan.csv" # /演算子がパスを結合
report.stem # "report_jan"(拡張子なし)
report.suffix # ".csv"
report.parent # Path("data/reports")
content = report.read_text() # ファイルの内容を直接読み取る
report.write_text("new content\n") # 直接書き込みosモジュールの場合:
import os
os.getcwd() # 現在の作業ディレクトリ
os.listdir(".") # ディレクトリの内容を一覧表示
os.path.exists("data.txt") # パスが存在する場合はTrue
os.path.join("data", "file.txt") # "data/file.txt"(クロスプラットフォーム)
os.environ.get("HOME") # 環境変数を読み取る新しいコードではpathlibを優先してください。osは環境変数が必要な場合や、文字列を期待する古いAPIを使用する場合に使用します。
timeit
timeitはコード実行にかかる時間を測定します。2つのアプローチを比較して、より速いものを選択する場合に便利です。安定した測定を得るために、コードを何度も実行します。
import timeit
# 単一のステートメントをタイムする
timeit.timeit("sum(range(1000))", number=10000)
# より複雑なブロックをタイムする
setup = "data = list(range(1000))"
code = "[x * 2 for x in data]"
time = timeit.timeit(code, setup=setup, number=10000)
print(f"{time:.4f} seconds for 10,000 runs")numberは繰り返す回数です。より多くの繰り返しは、より安定した測定を提供します。
string
stringモジュールは、文字、数字、句読点用の事前構築された文字列定数を提供します。文字を検査したり、特定のアルファベットからランダム文字列を生成する必要があるときに便利です。
import string
string.ascii_lowercase # "abcdefghijklmnopqrstuvwxyz"
string.ascii_uppercase # "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
string.ascii_letters # 両方が結合
string.digits # "0123456789"
string.punctuation # すべての句読点文字文字を検査したりランダム文字列を生成する必要があるときに便利です。
import string, random
chars = string.ascii_letters + string.digits
password = "".join(random.choices(chars, k=12))独自のモジュール作成
すべてのPythonファイルはモジュールです。別のファイルから使用するには、ファイル名で(.pyなし)インポートします。モジュール全体をインポートしてドット記法でその内容を使用するか、特定の名前をインポートして直接使用できます。
# utils.py
def clamp(value, lo, hi):
return max(lo, min(value, hi))
PI = 3.14159# main.py
import utils
utils.clamp(150, 0, 100) # 100
utils.PI # 3.14159
from utils import clamp
clamp(50, 0, 100) # 50Pythonはインポートするファイルと同じディレクトリ(および他のいくつかの場所)を見ることでモジュールを見つけます。より大きなプロジェクトの場合、モジュールはパッケージに編成されます。__init__.pyファイルを持つディレクトリ。
__name__ == "__main__"
Pythonがファイルを直接実行する場合、__name__は"__main__"に設定されます。同じファイルがモジュールとしてインポートされる場合、__name__はモジュール名です。このパターンは、ファイルを直接実行するときは実行されるが、別のモジュールによってインポートされるときはスキップされるコードを記述できます。
# utils.py
def clamp(value, lo, hi):
return max(lo, min(value, hi))
if __name__ == "__main__":
# これは以下の場合にのみ実行されます:python utils.py
# 以下の場合ではなく:import utils
print(clamp(150, 0, 100)) # 100これはモジュールとしても単独のスクリプトとしても有用なファイルの標準パターンです。
if __name__ == "__main__":は1つのファイルを、インポート可能なモジュールと実行可能なスクリプトの両方にします。ガードの下のコードは`python utils.py`を実行するときに実行され、別のファイルが`import utils`を実行するときはスキップされます。モジュールの下部に簡単なデモまたはテストを格納するのに便利です。 標準ライブラリのハイライト
知る価値のあるいくつかのモジュール。それぞれが、自分で実装するのに大きな作業を要する一般的な問題を解決します。
collections: 特殊化されたコンテナタイプ:
from collections import Counter, defaultdict, deque
Counter(["a", "b", "a", "c", "a"]) # Counter({'a': 3, 'b': 1, 'c': 1})
defaultdict(list) # 不足キーを自動作成する辞書
deque([1, 2, 3], maxlen=5) # 両端からの高速append/popitertools: イテラブル処理用ツール:
import itertools
list(itertools.chain([1, 2], [3, 4])) # [1, 2, 3, 4]
list(itertools.islice(range(100), 5)) # [0, 1, 2, 3, 4]
list(itertools.combinations([1, 2, 3], 2)) # [(1, 2), (1, 3), (2, 3)]
list(itertools.product([0, 1], repeat=2)) # [(0,0), (0,1), (1,0), (1,1)]sys: Pythonインタプリタへのアクセス:
import sys
sys.argv # コマンドライン引数のリスト
sys.exit(1) # ステータスコード付きで終了
sys.version # Pythonバージョン文字列サードパーティパッケージ: 標準ライブラリを超えて、pipはコミュニティパッケージをインストール:
pip install requests # HTTPライブラリ
pip install pandas # データ操作
pip install numpy # 数値計算サードパーティパッケージはこのガイドの範囲外ですが、パターンは常に同じです。pip install、その後import。
実践で
random、string、datetimeを組み合わせて、タイムスタンプ付きのユニークなゲームIDを生成します。
import random
import string
from datetime import datetime
def generate_game_id(length: int = 8) -> str:
chars = string.ascii_uppercase + string.digits
return "".join(random.choices(chars, k=length))
def timestamp() -> str:
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
game_id = generate_game_id()
print(f"[{timestamp()}] Starting game {game_id}")
scores = [random.randint(50, 100) for _ in range(5)]
print(f"Round scores: {scores}")
print(f"Best: {max(scores)}")
