10日で覚えるPythonDay 7: モジュールとパッケージ

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)
  1. カレントディレクトリ
  2. PYTHONPATH 環境変数
  3. 標準ライブラリ
  4. 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 など

重要ポイント

  1. モジュールでコードを整理・再利用
  2. from ... import で特定の要素だけをインポート
  3. __name__ == "__main__" でスクリプト実行を判定
  4. pipで外部パッケージをインストール
  5. 仮想環境でプロジェクトごとに環境を分離

練習問題

問題1: 基本

calculator.py というモジュールを作成し、add(), subtract(), multiply(), divide() の4つの関数を実装してください。別のファイルからインポートして使用してみましょう。

問題2: 標準ライブラリ

random モジュールを使って、1から100までのランダムな数を10個生成し、その合計と平均を表示するプログラムを書いてください。

チャレンジ問題

パッケージを作成してください:

  • パッケージ名: utils
  • モジュール: string_utils.py(文字列操作関数)
  • モジュール: math_utils.py(数学計算関数)
  • __init__.py でよく使う関数を公開

参考リンク


次回予告: Day 8では「ファイル操作と例外処理」について学びます。データの読み書きとエラーハンドリングをマスターしましょう!