Day 7: モジュールとパッケージ
今日学ぶこと
- モジュールとは何か
- import文の使い方
- 標準ライブラリの活用
- パッケージの構造
- 仮想環境とpip
モジュールとは?
モジュールは、Pythonのコードをまとめたファイル(.py)です。関数、クラス、変数を再利用可能な形で整理できます。
flowchart TB
subgraph Module["モジュール(.py ファイル)"]
A["関数"]
B["クラス"]
C["変数"]
end
Module --> D["他のプログラムで再利用"]
style Module fill:#3b82f6,color:#fff
style D fill:#22c55e,color:#fff
なぜモジュールを使うのか?
| メリット | 説明 |
|---|---|
| 再利用性 | 同じコードを複数のプログラムで使える |
| 整理 | コードを論理的な単位に分割できる |
| 名前空間 | 名前の衝突を避けられる |
| 保守性 | 変更箇所を特定しやすい |
import文
基本的なimport
# モジュール全体をインポート
import math
print(math.pi) # 3.141592653589793
print(math.sqrt(16)) # 4.0
from ... import
特定の要素だけをインポート:
from math import pi, sqrt
print(pi) # 3.141592653589793
print(sqrt(16)) # 4.0(math.をつけなくてよい)
エイリアス(別名)
import numpy as np # 長い名前を短縮
import pandas as pd
# よく使われる慣例
import matplotlib.pyplot as plt
すべてをインポート(非推奨)
from math import * # 全ての要素をインポート
# 推奨されない理由:
# - どこから来た名前か分からなくなる
# - 名前の衝突が起きやすい
自作モジュール
モジュールの作成
my_module.py ファイルを作成:
# my_module.py
"""自作モジュールの例"""
PI = 3.14159
def greet(name):
"""挨拶を表示する"""
print(f"Hello, {name}!")
def add(a, b):
"""2つの数を足す"""
return a + b
class Calculator:
"""簡単な計算機"""
def multiply(self, a, b):
return a * b
モジュールの使用
同じディレクトリにある main.py から使用:
# main.py
import my_module
my_module.greet("Taro") # Hello, Taro!
print(my_module.PI) # 3.14159
print(my_module.add(3, 5)) # 8
calc = my_module.Calculator()
print(calc.multiply(4, 5)) # 20
__name__ と __main__
モジュールが直接実行されたか、インポートされたかを判定:
# my_module.py
def main():
print("モジュールが直接実行されました")
if __name__ == "__main__":
main()
python my_module.py # "モジュールが直接実行されました" が表示される
# 別のファイルからインポート
import my_module # main() は実行されない
標準ライブラリ
Pythonには多くの便利な標準モジュールが含まれています。
よく使う標準モジュール
| モジュール | 用途 | 例 |
|---|---|---|
os |
OS操作 | ファイルパス、環境変数 |
sys |
システム | コマンドライン引数 |
math |
数学 | 三角関数、対数 |
random |
乱数 | ランダム値生成 |
datetime |
日時 | 日付・時刻操作 |
json |
JSON | JSONの読み書き |
re |
正規表現 | パターンマッチング |
collections |
データ構造 | Counter, defaultdict |
os モジュール
import os
# カレントディレクトリ
print(os.getcwd())
# ディレクトリの内容を一覧
print(os.listdir('.'))
# 環境変数
print(os.environ.get('HOME'))
# パス操作
path = os.path.join('folder', 'file.txt')
print(path) # folder/file.txt(OSに応じて)
# ファイルの存在確認
print(os.path.exists('file.txt'))
random モジュール
import random
# 0.0 から 1.0 の乱数
print(random.random())
# 範囲内のランダムな整数
print(random.randint(1, 10))
# リストからランダムに選択
fruits = ['apple', 'banana', 'cherry']
print(random.choice(fruits))
# リストをシャッフル
random.shuffle(fruits)
print(fruits)
# 複数の要素をランダムに選択
print(random.sample(range(100), 5))
datetime モジュール
from datetime import datetime, date, timedelta
# 現在の日時
now = datetime.now()
print(now) # 2024-01-15 10:30:45.123456
# 日付のみ
today = date.today()
print(today) # 2024-01-15
# 特定の日時を作成
dt = datetime(2024, 12, 25, 10, 30)
print(dt) # 2024-12-25 10:30:00
# フォーマット
print(now.strftime('%Y年%m月%d日')) # 2024年01月15日
# 日時の計算
tomorrow = today + timedelta(days=1)
next_week = today + timedelta(weeks=1)
json モジュール
import json
# Python → JSON文字列
data = {'name': 'Taro', 'age': 25, 'city': 'Tokyo'}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str) # {"name": "Taro", "age": 25, "city": "Tokyo"}
# JSON文字列 → Python
parsed = json.loads(json_str)
print(parsed['name']) # Taro
# ファイルへの書き込み
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# ファイルからの読み込み
with open('data.json', 'r', encoding='utf-8') as f:
loaded = json.load(f)
パッケージ
パッケージは、複数のモジュールをディレクトリにまとめたものです。
パッケージの構造
my_package/
├── __init__.py # パッケージの初期化(空でも可)
├── module1.py
├── module2.py
└── subpackage/
├── __init__.py
└── module3.py
__init__.py
パッケージを初期化するファイル。インポート時に実行されます:
# my_package/__init__.py
from .module1 import function1
from .module2 import function2
__all__ = ['function1', 'function2']
パッケージの使用
# 方法1: モジュールをインポート
from my_package import module1
module1.function1()
# 方法2: 関数を直接インポート
from my_package.module1 import function1
function1()
# 方法3: __init__.py で公開されているもの
from my_package import function1
function1()
# サブパッケージ
from my_package.subpackage import module3
pip と外部パッケージ
pipとは?
pip はPythonのパッケージ管理ツールで、PyPI(Python Package Index)からパッケージをインストールできます。
基本的な使い方
# パッケージのインストール
pip install requests
# バージョン指定
pip install requests==2.28.0
# アップグレード
pip install --upgrade requests
# アンインストール
pip uninstall requests
# インストール済みパッケージ一覧
pip list
# パッケージ情報
pip show requests
requirements.txt
プロジェクトの依存関係を管理:
# 現在の環境を出力
pip freeze > requirements.txt
# requirements.txt からインストール
pip install -r requirements.txt
requirements.txt の例:
requests==2.28.0
numpy>=1.20.0
pandas
仮想環境
プロジェクトごとに独立したPython環境を作成できます。
flowchart TB
subgraph System["システムPython"]
S["グローバルパッケージ"]
end
subgraph VE1["仮想環境A"]
A["プロジェクトA用パッケージ"]
end
subgraph VE2["仮想環境B"]
B["プロジェクトB用パッケージ"]
end
style System fill:#ef4444,color:#fff
style VE1 fill:#3b82f6,color:#fff
style VE2 fill:#22c55e,color:#fff
venv を使った仮想環境
# 仮想環境の作成
python -m venv myenv
# 仮想環境の有効化
# Windows
myenv\Scripts\activate
# macOS/Linux
source myenv/bin/activate
# 仮想環境を無効化
deactivate
仮想環境のメリット
| メリット | 説明 |
|---|---|
| 分離 | プロジェクト間でパッケージが干渉しない |
| 再現性 | 同じ環境を他のマシンで再現できる |
| クリーンな状態 | システムPythonを汚さない |
モジュール検索パス
Pythonがモジュールを探す順序:
import sys
print(sys.path)
- カレントディレクトリ
PYTHONPATH環境変数- 標準ライブラリ
- site-packages(pipでインストールしたパッケージ)
パスの追加
import sys
sys.path.append('/path/to/my/modules')
まとめ
| 概念 | 説明 | 例 |
|---|---|---|
| モジュール | .py ファイル |
import math |
| パッケージ | ディレクトリ + __init__.py |
from package import module |
| pip | パッケージ管理 | pip install requests |
| venv | 仮想環境 | python -m venv myenv |
| 標準ライブラリ | Python組み込みモジュール | os, sys, json など |
重要ポイント
- モジュールでコードを整理・再利用
from ... importで特定の要素だけをインポート__name__ == "__main__"でスクリプト実行を判定- pipで外部パッケージをインストール
- 仮想環境でプロジェクトごとに環境を分離
練習問題
問題1: 基本
calculator.py というモジュールを作成し、add(), subtract(), multiply(), divide() の4つの関数を実装してください。別のファイルからインポートして使用してみましょう。
問題2: 標準ライブラリ
random モジュールを使って、1から100までのランダムな数を10個生成し、その合計と平均を表示するプログラムを書いてください。
チャレンジ問題
パッケージを作成してください:
- パッケージ名:
utils - モジュール:
string_utils.py(文字列操作関数) - モジュール:
math_utils.py(数学計算関数) __init__.pyでよく使う関数を公開
参考リンク
次回予告: Day 8では「ファイル操作と例外処理」について学びます。データの読み書きとエラーハンドリングをマスターしましょう!