Pythonに、標準でインストールされている関数だとしても、組み込み関数以外の関数を使うには、先にモジュールを読み込む必要があります。
この「モジュールとは何か?」を理解しておくと、学習の効率が早まります。また、Python では、沢山のモジュールが用意されているということを知っておくことで、将来、必要が出てきた時に、使える関数を自力で見つけられるようにもなります。
そのためにも、ここで詳しく解説しておきたいと思います。
1. Pythonのモジュールとは
1.1. モジュールとは「部品」のこと
モジュールとは、元々は、家を立てたり、家具を作ったりする時の、一つ一つの部分(パーツ)のことです。建築の際は、あらかじめ書いている図面の通りに、パーツを作っていき、最後に、それらのパーツを組み合わせて完成させます。
プログラミングもこれと同じで、パーツ毎にファイルを分けて、一つずつ完成させていきます。
例えば、図のようなシンプルなブログを作る時を考えてみましょう。これは、
- ヘッダー
- ポスト
- サイドバー
- フッター
の 4 つのパーツから成り立っていますね。
このような時は、それぞれのパーツ毎に、別のファイルを作り、一つずつ完成させていきます。そして、最後に、それぞれのファイルを組み込み、 1 つのブログを完成させます。
もし、このようにパーツごとに、ファイルを分けずに、全てのコードが 1 つのファイルに書かれているとします。そして、完成間近というところで、重大なエラーが発生しました。この場合、10,000 行の中から、問題を起こしている 1 行を突き止める必要があります。
それはとてもとても大変です。
しかし、パーツ毎にファイルを作っていれば、エラーの内容から、どこでエラーが起きているのかが分かり、原因箇所の解明が遥かに迅速になります。こうした利点があるため、プログラマーは、大きなプログラムを、部品ごとに、別ファイルに分解して書いていきます。
1.2. Python は機能別に分けてファイル(モジュール)を用意している
ブログは、それを構成する “パーツ毎” にファイルを分けて作っています。
Python では、” 機能毎 ” にファイルが分けられています。例えば、「計算機能をまとめたファイル」「カレンダー機能をまとめたファイル」という具合です。そして、そのように機能ごとに分割されたファイルを「モジュール」といいます。
それぞれのモジュールに置かれている機能(関数)は、下図のように、Python にモジュールを読み込ませることで使えるようになります。
このように、「標準ライブラリ」というところにあるモジュールを引っ張ってきて、Python に読み込ませる ( import といいます)ことで、より多くの関数を使えるようになります。「標準ライブラリ」は、シンプルに、Python のモジュールの保管場所とされている図書館とお考えください。
これらのモジュールを使いこなすことによって、語弊を恐れずに言えば、Python でほぼ何でも行えるようになります。
例えば、math モジュールというものがあります。
math モジュールには、数学的な計算を、楽に実行するための多くの関数が用意されています。これらの関数を使うと、通常の組み込み関数だけでは、不可能な計算もできるようになります。例えば、以下のように、距離と角度から高さを計算する、などです。
このような場合で、高さを求めるには、次のようなコードを書くことができます。ここでは、距離は20m、角度は32度とします。
import math #mathモジュールを読み込んでいます。
kyori = 20
kakudo = math.radians(32) #角度をラジアンに換算
takasa = kyori * math.tan(kakudo) #高さを計算
takasa = math.floor(takasa * 100)/100 #小数点以下第2位を切り捨て
print(str(takasa) + "m") #計算結果を文字列に変換して出力
コードの内容を理解する必要は全くありませんのでご安心ください。ここでは、「モジュールを使いこなせるようになると、組み込み関数以外の様々な関数を使えるようになり、プログラミングで出来ることが飛躍的に増える」ということを実感して頂ければ十分です。
2. モジュールをインポートする方法と関数の使い方
それでは、ここから、モジュールをインポートして、そのモジュールの関数を使う方法を解説していきます。
方法は 4 つあります。
- モジュール全体をインポートする。
- モジュール全体を別名をつけてインポートする。
- モジュールから特定の関数だけをインポートする。
- モジュールから特定の関数だけを別名をつけてインポートする。
最初は 1. と 3. だけ抑えておくだけでも十分だと思います。また、それぞれの項で、関数を使う方法も一緒に解説しています。
それでは見ていきましょう。
2.1. モジュール全体をインポートする
まずは、最も基本的なインポート方法です。以下をご覧ください。
'''モジュールのインポートの書式'''
import モジュール名, モジュール名
このように、import と書いてから、読み込みたいモジュール名を入力するだけです。同時に複数のモジュールをインポートしたい場合は、カンマで区切って、続けて入力します。
インポートしたモジュールの関数を使うには、次のように書きます。
'''インポートしたモジュール内の関数を使う時の書式'''
モジュール名.関数名()
組み込み関数を使う時と違って、関数名の前にモジュール名を書き、ドットで繋ぎます。
それでは、例を見ていきましょう。擬似乱数を作成する関数が豊富に揃っている random モジュールをインポートします。
'''random モジュールを読み込みます。'''
import random
'''randomモジュールの関数を使うには、 'random.関数名()' と書きます。'''
random.randint(1, 10)
randint 関数は、引数に指定した数値の範囲で、ランダムに整数を返す関数です。簡単ですね。
2.2. モジュール全体を別名をつけてインポートする
これは、自分で新たなモジュールを作った場合で、自作したモジュールの名前が、既に存在するモジュール名と被る時ぐらいしか使わないと思います。つまり非常にレアケースの場合のみということですね。
しかし、念のため解説しておきたいと思います。
次のように書くと、モジュールに別名をつけてインポートすることができます。
'''インポートするモジュールに別名をつける場合の書式'''
import モジュール名 as 別名
モジュールに別名をつけたので、その中の関数を使うには、最初に別名を入力します。
'''random モジュールに rand という別名をつけてインポートします。'''
import random as rand
'''この場合、そのモジュール内の関数を使うには '別名.関数名()'と書きます。'''
rand.randint(1, 10)
2.3. モジュールから特定の関数だけをインポートする
モジュール全体ではなく、そのモジュールから特定の関数だけをインポートすることもできます。
次のように書きます。
'''モジュールから使いたい関数だけをインポートする時の書式'''
from モジュール名 import 関数名
特定の関数だけをインポートした場合は、その関数を使う時に、先頭にモジュール名をつける必要がなくなります。
'''randint 関数だけをインポートします。'''
from random import randint
'''この場合、行頭にモジュール名をつけなくても関数を使用できます。'''
randint(1, 10)
インポートした関数を、何度も使用する際は、こちらの方が便利ですね。
2.4. モジュールから特定の関数だけを別名をつけてインポートする
特定の関数だけをインポートする場合も、その関数に別名をつけることができます。
これは、自作した関数と、インポートしたい関数の名前が被ってしまっている場合に有効です。このようなケースは、時に起こりますので、覚えておくと良いでしょう。
次のように書きます。
'''インポートした関数の名前を帰る時の書式'''
from モジュール名 import 関数名 as 別名
以下が使用例です。
'''randint 関数に別名をつけてインポートします。'''
from random import randint as rand
'''この場合も行頭にモジュール名は不要です。'''
rand(1, 10)
3. Python で用意されているモジュール一覧
ここから、Python で現在用意されているモジュールの一覧を列挙しています。これらは全て Python の公式ドキュメントの「Python 標準ライブラリ」のページで、列挙、解説されています。ただし、普段、どのようなモジュールがあるのかを、改めて時間を取って見てみることはあまりないと思います。
そこで、ここでサッと眺めてみるのも良いかと思い掲載することにしました。きっと沢山のモジュールがあることに驚くことでしょう。
もちろん、全てのモジュールを知っておく必要はありません。必要になった時に、自分で調べてみて、その中に、有用な関数があるかどうかを調べられるようになることが重要です。
それでは見ていきましょう。
3.1. テキスト処理モジュール
モジュール名 | 役割 |
string | 一般的な文字列操作 |
re | 正規表現操作 |
difflib | 差分の計算の補助 |
textwrap | テキストの折り返しと詰め込み |
unicodedata | Unicode のデータベース |
stringprep | 文字列調整 |
readline | GNU readline のインターフェイス |
rlcompleter | GNU readline 向けの補完関数 |
3.2. 数値と数学モジュール
モジュール名 | 役割 |
numbers | 数の抽象基底のクラス |
math | 数学関数 |
cmath | 複素数の数学関数 |
decimal | 十進数と浮動小数点数の算術関数 |
fractions | 有理数 |
random | 擬似乱数の生成 |
statistics | 数理統計の関数 |
3.3. データ型モジュール
モジュール名 | 役割 |
datetime | 基本的な日付型と時間型 |
calendar | 一般的なカレンダーに関する関数群 |
collections | コンテナデータ型 |
collections.abc | コレクションの抽象基底クラス |
heapq | ヒープキューアルゴリズム |
bisect | 配列二分法アルゴリズム |
array | 効率の良い数値アレイ |
weakref | 弱参照 |
types | 動的な型生成と組み込み型に対する名前 |
copy | 浅いコピーと深いコピーの操作 |
pprint | データ出力の整然化 |
reprlib | もう一つの repr() の実装 |
enum | 列挙型のサポート |
3.4. バイナリデータ処理モジュール
モジュール名 | 役割 |
struct | バイト列をパックされたバイナリデータとして解釈 |
codecs | codec レジストリと基底クラス |
3.5 関数型プログラミング用モジュール
モジュール名 | 役割 |
itertools | 効率的なループ実行のためのイテレータ生成関連 |
functools | 高階関数と呼び出し可能なオブジェクトの操作 |
operator | 関数形式の標準演算子 |
3.6. ファイルとディレクトリへのアクセス
モジュール名 | 役割 |
pathlib | オブジェクト指向のファイルシステムパス |
os.path | 共通のパス名操作 |
fileinput | 複数の入力ストリームを跨いだ行の繰り返し処理のサポート |
stat | stat() の結果の解釈 |
filecmp | ファイルやディレクトリの比較 |
tempfile | 一時ファイルやディレクトリの作成 |
glob | Unix 形式のパス名のパターン展開 |
fnmatch | Unix ファイル名のパターンマッチ |
linecache | テキストラインにランダムアクセスする |
shutil | 高水準のファイル操作 |
macpath | Mac OS 9 のパス操作関数 |
3.7. データの永続化
モジュール名 | 役割 |
pickle | Python オブジェクトの直列化 |
copyreg | pickle サポート関数の登録 |
shelve | Python オブジェクトの永続化 |
marshal | 内部使用者向けの Python オブジェクト整列化 |
dbm | Unix データベースへのインターフェイス |
sqlite3 | SQLite データベースに対する DB-API 2.0 インターフェイス |
3.8. データ圧縮とアーカイブ
モジュール名 | 役割 |
zlib | gzip 互換の圧縮 |
gzip | gzip ファイルのサポート |
bz2 | bzip2 圧縮のサポート |
lzma | LZMA アルゴリズムを使用した圧縮 |
zipfile | ZIP アーカイブの処理 |
tarfile | tar アーカイブファイルの読み書き |
3.9. ファイルフォーマット
モジュール名 | 役割 |
csv | CSVファイルの読み書き |
configparser | 設定ファイルのパーサー |
netrc | netrc ファイルの処理 |
xdrlib | XDRデータのエンコードとデコード |
plistlib | Mac OS X .plist ファイルの生成と解析 |
3.10. 暗号関連のサービス
モジュール名 | 役割 |
hashlib | セキュアハッシュおよびメッセージダイジェスト |
hmac | メッセイジ認証のための鍵付きハッシュ化 |
secrets | 機密を扱うために安全な乱数を生成する |
3.11. 汎用オペレーティングシステムサービス
モジュール名 | 役割 |
os | 雑多なオペレーティングシステムインターフェイス |
io | ストリームを扱うコアツール |
time | 時刻データへのアクセスと変換 |
argparse | コマンドラインオプション、引数、サブコマンドのパーサー |
getopt | C 言語スタイルのコマンドラインオプションパーサー |
logging | Python 用ロギング機能 |
logging.config | ロギングの環境設定 |
logging.handlers | ロギングハンドラ |
getpass | 可搬性のあるパスワード入力機構 |
curses | 文字セル表示を扱うための端末操作 |
curses.textpaad | curses プログラムのためのテキスト入力ウィジェット |
curses.ascii | ASCII 文字に関するユーティリティ |
curses.panel | curses のためのパネルスタック拡張 |
platform | 実行中プラットフォームの固有情報を参照する |
errno | 標準の errno システムシンボル |
ctypes | Python のための外部関数ライブラリ |
3.12. 並行実行
モジュール名 | 役割 |
threading | スレッドベースの並列処理 |
multiprocessing | プロセスベースの並列処理 |
concurrent | パッケージ |
concurrent.futures | 並列タスク実行 |
subprocess | サブプロセス管理 |
sched | イベントスケジューラー |
queue | 同期キュークラス |
dummy_threading | threading の代替モジュール |
_therad | 低水準のスレッド API |
_dummy_thread | _thread の代替モジュール |
3.13. プロセス間通信とネットワーク
モジュール名 | 役割 |
socket | 低水準ネットワークインターフェイス |
ssl | ソケットオブジェクトに対する TLS/SSL ラッパー |
select | I/O 処理の完了を待機する |
selectors | 高水準のI/O多重化 |
asyncio | 非同期I/O、イベントループ、コルーチンおよびタスク |
asyncore | 非同期ソケットハンドラ |
asynchat | 非同期ソケットコマンド/レスポンスハンドラ |
signal | 非同期イベントにハンドラを設定する |
mmap | メモリマップファイル |
3.14. インターネット上のデータ操作
モジュール名 | 役割 |
電子メールと MIME 処理のためのパッケージ | |
json | JSON エンコーダおよびデコーダ |
mailcap | mailcap ファイルの操作 |
mailbox | 様々な形式のメールボックス操作 |
mimetypes | ファイル名を MIME 型へマップする |
base64 | Base16, Base32, Base64, Base85 データの符号化 |
binhex | binhex4 形式ファイルのエンコードおよびデコード |
binascii | バイナリデータと ASCII データとの間での変換 |
quopri | MIME quoted-printable 形式データのエンコードおよびデコード |
uu | uuencode 形式のエンコードとデコード |
3.15. 構造化マークアップツール
モジュール名 | 役割 |
html | HyperText Markup Language のサポート |
html.parser | HTML および XHTML のシンプルなパーサー |
html.entities | HTML 一般実体の定義 |
xml.etree.ElementTree | ElementTree XML API |
xml.dom | 文書オブジェクトモデル(DOM)API |
xml.dom.minidom | 最小の DOM の実装 |
xml.dom.pulldom | 部分的な DOM ツリー構築のサポート |
xml.sax | SAX2 パーサのサポート |
xml.sax.xmlreader | XML パーサのインターフェイス |
xml.sax.handler | SAX ハンドラの基底クラス |
xml.sax.saxutils | SAX ユーティリティ |
xml.parsers.expat | Expat を使った高速な XML 解析 |
3.16. インターネットプロトコルとサポート
モジュール名 | 役割 |
webbrowser | 便利なウェブブラウザコントローラー |
cgi | CGI(ゲートウェイインターフェイス規格)のサポート |
cgitb | CGI スクリプトのトレースバック管理機構 |
wsgiref | WSGI ユーティリティとリファレンス実装 |
urllib | URL を扱うモジュール群 |
urllib.request | URL を開くための拡張可能なライブラリ |
urllib.response | urllib で使用するレスポンスクラス |
urllib.parse | URL を解析して構成要素にする |
urllib.error | urllib.request が投げかける例外 |
urllib.robotparser | robots.txt のためのパーサー |
http | HTTP モジュール群 |
http.client | HTTP プロトコルクライアント |
ftplib | FTP プロトコルクライアント |
poplib | POP3 プロトコルクライアント |
imaplib | IMAP4プロトコルクライアント |
nntplib | NNTP プロトコルクライアント |
smtplib | SMTP プロトコルクライアント |
smtpd | SMTP サーバー |
telnetlib | Telnet クライアント |
uuid | RFC 4122 に準拠した UUID オブジェクト |
socketserver | ネットワークサーバのフレームワーク |
http.server | HTTP サーバー |
http.cookiejar | HTTP クライアント用の Cookie 処理 |
xmlrpc | XMLRPC サーバとクライアントモジュール |
xmlrpc.client | XML-RPC クライアントアクセス |
xmlrpc.server | 基本的な XML – RPC サーバー |
ipaddress | IPv4 / IPv6 操作ライブラリ |
3.17. マルチメディアサービス
モジュール名 | 役割 |
audioop | 生の音声データを操作する |
aifc | AIFF および AIFC ファイルの読み書き |
sunau | Sun AU ファイルの読み書き |
wave | WAV ファイルの読み書き |
chunk | IFFチャンクデータの読み込み |
colorsys | 色体系間の変換 |
imghdr | 画像の形式を決定する |
sndhdr | サウンドファイルの識別 |
ossaudiodev | OSS 互換オーディオデバイスへのアクセス |
3.18. 国際化
モジュール名 | 役割 |
gettext | 多言語対応に関する国際化サービス |
locale | 国際化サービス |
3.19. プログラムのフレームワーク
モジュール名 | 役割 |
turtle | タートルグラフィックス |
cmd | 行指向のコマンドインタープリタのサポーt |
shlex | 単純な字句解析 |
3.20. Tk を用いたグラフィカルユーザーインターフェイス
モジュール名 | 役割 |
tkinter | Tcl/Tk の Python インターフェイス |
tkinter.ttk | Tk のテーマ付きウィジェット |
tkinter.tix | Tk の拡張ウィジェット |
tkinter.scrolledtext | スクロールするテキストウィジェット |
IDLE | |
その他 |
3.21. 開発ツール
モジュール名 | 役割 |
typing | 型ヒントのサポート |
pydoc | ドキュメント生成とオンラインヘルプシステム |
doctest | 対話的な実行例をテストする |
unittest | ユニットテストフレームワーク |
unittest.mock | モックオブジェクトライブラリ |
unittest.mock | 入門 |
2to3 | Python 2 から 3 への自動コード変換 |
test | Python 用回帰テストパッケージ |
test.support | テストのためのユーティリティ関数 |
3.22. デバッグとプロファイル
モジュール名 | 役割 |
bdb | デバッガーフレームワーク |
faulthandler | Python traceback のダンプ |
pdb | Python デバッガ |
Python プロファイラ | |
timeit | 小さなコード断片の実行時間計測 |
trace | Python 文実行のトレースと追跡 |
tracemalloc | メモリ割り当ての追跡 |
3.23. ソフトウェア・パッケージと配布
モジュール名 | 役割 |
distutils | Python モジュールの構築とインストール |
ensurepip | pip インストーラーのブートストラップ |
venv | 仮想環境の作成 |
zipapp | 実行可能な Python zip 書庫を管理する |
3.24. Python ランタイムサービス
モジュール名 | 役割 |
sys | システムパラメータと関数 |
sysconfig | Python の構成情報にアクセスする |
builtins | 組み込みオブジェクト |
__main__ | トップレベルのスクリプト環境 |
warnings | 警告の制御 |
contextlib | with 文コンテキスト用ユーティリティ |
abc | 抽象基底クラス |
atexit | 終了ハンドラ |
traceback | スタックトレースの表示または取得 |
__future__ | future 文の定義 |
gc | ガベージコレクタインターフェイス |
inspect | 活動中のオブジェクトの情報を取得する |
site | サイト固有の設定フック |
fpectl | 浮動小数点例外の制御 |
3.25. カスタム Python インタプリタ
モジュール名 | 役割 |
code | インタプリタ基底クラス |
codeop | Pythonコードをコンパイルする |
3.26. モジュールのインポート
モジュール名 | 役割 |
zipimport | Zip アーカイブからモジュールを import する |
pkgutil | パッケージ拡張ユーティリティ |
modulefinder | スクリプト中で使われているモジュールを検索する |
runpy | Python モジュールの位置特定と実行 |
importlib | import の実装 |
3.27. Python 言語サービス
モジュール名 | 役割 |
parser | Python 解析木にアクセスする |
ast | 抽象構文木 |
symtable | コンパイラの記号表へのアクセス |
symbol | Python 解析木とともに使われる定数 |
token | Python 解析木とともに使われる定数 |
keyword | Python キーワードチェック |
tokenize | Python ソースのためのトークナイザ |
tabnanny | あいまいなインデントの検出 |
pyclbr | Python クラスブラウザサポート |
py_compile | Python ソースファイルのコンパイル |
compileall | Python ライブラリをバイトコンパイル |
dis | Python バイトコードの逆アセンブラ |
pickletools | pickle 開発者のためのツール群 |
3.28. 各種サービス
モジュール名 | 役割 |
formatter | 汎用の出力書式化機構 |
3.29. MS Windows 固有のサービス
モジュール名 | 役割 |
msilib | Microsoft インストーラーファイルの読み書き |
msvcrt | MS VC++ 実行時システムの有用なルーチン群 |
winreg | Windows レジストリへのアクセス |
winsound | Windows 用の音声再生インターフェイス |
3.30. Unix 固有のサービス
モジュール名 | 役割 |
posix | 最も一般的な POSIX システムコール群 |
pwd | パスワードデータベースへのアクセスを提供する |
spwd | シャドウパスワードデータベース |
grp | グループデータベースへのアクセス |
crypt | Unix パスワードをチェックするための関数 |
termios | POSIX スタイルの端末制御 |
tty | 端末制御のための関数群 |
pty | 擬似端末ユーティリティ |
fcntl | fcntl および ioctl システムコール |
pipes | シェルパイプラインへのインターフェイス |
resouce | リソース使用状態の情報 |
nis | Sun のNIS(Yellow Pages)へのインターフェイス |
syslog | Unix syslog ライブラリルーチン群 |
3.31. 取って代わられたモジュール群
モジュール名 | 役割 |
optparse | コマンドラインオプション解析器 |
imp | import 内部へのアクセス |
3.32. ドキュメント化されていないモジュール
モジュール名 | 役割 |
プラットフォーム固有のモジュール |
4. まとめ
いかがだったでしょうか。
モジュールを使いこなせるようになると、Python のプログラミングでできることの幅が大きく広がります。そのためにも、モジュールをインポートする方法はしっかりと覚えておきましょう。
また、驚くほど沢山のモジュールがありますので、何か新しいプログラムを書きたい時は、あらためて公式ドキュメントの標準ライブラリページから、使える関数を探してみるということも癖づけておくと良いでしょう。
ぜひ、参考にして頂ければと思います。
コメント
コメント一覧 (2件)
僕はpython初心者です。モジュールについて”本当に分かり易く”解説して頂き有難うございました。
非常に分かりやすく解説をして頂き感謝致しております。
ありがとうございます。