Pythonモジュール・パッケージ・ライブラリ
import文、標準ライブラリ、自作モジュール、外部ライブラリの使い方を練習できるPython演習問題集。
Pythonのimport文、標準ライブラリ、自作モジュール、外部ライブラリの扱いを、短い問題で順番に練習する記事です。モジュールを読み込む感覚、名前空間、ファイル分割の考え方を、手を動かしながら確認できます。
使い方: まず問題を読んでPythonファイルに自分の答えを書き、実行してからヒントや解答を開いて確認してください。解答はページを開いた直後は隠れています。表示状態は保存しないため、ページを開き直すとすべて閉じた状態に戻ります。
対象: import文・標準ライブラリ・自作モジュール・発展(自作パッケージ・サードパーティライブラリ) 目標: この問題集に取り組むだけで、Pythonのモジュールを自在にインポートして使えるようになる
学習の進め方
- 問題文を読む
- まず自力で考えてみる(5〜10分)
- 詰まったらヒントを順番に読む(一気に全部読まないこと!)
- 自力で答えを書いてみる
- 最後に「解答」を確認する
第1章: import文の基本
ポイント: モジュールとは「機能をまとめたファイル」。
importで読み込んで使う。
問題 1-1: 基本的なimport
問題:
math モジュールをインポートして、以下の計算を行ってください。
- 円周率(π)を表示せよ
- √2(2の平方根)を計算して表示せよ
16の平方根を計算して表示せよ
💡 ヒント1(まず読む)
Pythonには最初から使える便利な「標準ライブラリ」がある。
math はそのひとつで、数学的な計算に使う関数や定数が入っている。
使う前に import モジュール名 で読み込む必要がある。
💡 ヒント2(まだ詰まってる場合)
import したあとは モジュール名.機能名 の形で使う:
import math
math.??? # mathモジュールの何かを使うmath モジュールの主な中身:
math.pi→ 円周率math.sqrt(x)→ xの平方根
💡 ヒント3(もう一歩)
import math
print(math.pi) # 円周率
print(math.sqrt(2)) # √2
print(math.sqrt(16)) # √16解答を見る 解答を閉じる
import math
# 1. 円周率
print(math.pi) # 3.141592653589793
# 2. √2
print(math.sqrt(2)) # 1.4142135623730951
# 3. √16
print(math.sqrt(16)) # 4.0解説:
import math でモジュールを読み込むと、math.pi や math.sqrt() のように
モジュール名.機能名 の形で中の機能を使える。
math.sqrt(16) の結果が 4 ではなく 4.0(小数)なのは、sqrt() が常に浮動小数点数を返すため。
問題 1-2: from…import構文
問題:
math モジュールから pi と sqrt だけをインポートして、問題1-1と同じ計算を行ってください。
ただし今回は math. をつけずに使えるようにしてください。
💡 ヒント1(まず読む)
import math だと、使うたびに math.pi math.sqrt() と書かないといけない。
from ... import ... 構文を使うと、モジュール名を省略して直接使える。
💡 ヒント2(まだ詰まってる場合)
書き方:
from モジュール名 import 機能名1, 機能名2例:
from math import pi, sqrt
print(pi) # math. なしで使える
print(sqrt(2)) # math. なしで使える💡 ヒント3(もう一歩)
複数の機能をインポートするにはカンマで区切る:
from math import pi, sqrt解答を見る 解答を閉じる
from math import pi, sqrt
# 1. 円周率
print(pi) # 3.141592653589793
# 2. √2
print(sqrt(2)) # 1.4142135623730951
# 3. √16
print(sqrt(16)) # 4.0解説:
from math import pi, sqrt は「mathモジュールから pi と sqrt だけ取り出す」という意味。
math.pi → pi、math.sqrt() → sqrt() と短く書けるようになる。
ただし from math import *(全部インポート)は、どの名前がどこから来たか分かりにくくなるので
実務では避けるのが一般的。
問題 1-3: as(エイリアス)
問題:
numpy のような長い名前のライブラリは慣習的に短い名前をつけて使います。
import ... as ... 構文を使って以下を実現してください。
mathモジュールをmという名前でインポートせよm.piとm.sqrt(9)を表示せよdatetimeモジュールをdtという名前でインポートし、現在の日付を表示せよ
💡 ヒント1(まず読む)
as を使うとモジュールに別名(エイリアス)をつけられる。
長いモジュール名を短く書きたいときや、名前の衝突を避けたいときに使う。
代表例: import numpy as np、import pandas as pd(データ分析の世界では定番)
💡 ヒント2(まだ詰まってる場合)
書き方:
import モジュール名 as 別名以降は 別名.機能名 の形で使う:
import math as m
m.pi # math.pi と同じ
m.sqrt(9) # math.sqrt(9) と同じ💡 ヒント3(datetimeについて)
datetime モジュールで現在の日付・時刻を取得するには:
import datetime as dt
dt.datetime.now() # 現在の日時
dt.date.today() # 今日の日付だけ解答を見る 解答を閉じる
# 1, 2. math を m としてインポート
import math as m
print(m.pi) # 3.141592653589793
print(m.sqrt(9)) # 3.0
# 3. datetime を dt としてインポートして今日の日付を表示
import datetime as dt
today = dt.date.today()
print(today) # 例: 2026-04-03解説:
エイリアスは慣習が重要。import numpy as np や import pandas as pd は
世界中のPythonエンジニアが使う共通の書き方なので、これに合わせておくと
他の人のコードも読みやすくなる。
第2章: 標準ライブラリを使う
ポイント: Pythonには最初から使える便利なライブラリが多数ある。インストール不要でそのまま使える。
問題 2-1: randomモジュール
問題:
random モジュールを使って以下を実装してください。
- 1〜6のランダムな整数を生成せよ(サイコロ)
["グー", "チョキ", "パー"]からランダムに1つ選べ[1, 2, 3, 4, 5]をランダムに並び替えよ
💡 ヒント1(まず読む)
random モジュールにはランダムな値を生成する関数が入っている。
import random でインポートして使う。
💡 ヒント2(まだ詰まってる場合)
random モジュールの主な関数:
random.randint(a, b)→ a以上b以下の整数をランダムに返すrandom.choice(リスト)→ リストからランダムに1つ選ぶrandom.shuffle(リスト)→ リストをランダムに並び替える(元のリストを変更)
💡 ヒント3(もう一歩)
import random
# サイコロ
random.randint(1, 6)
# リストから1つ選ぶ
random.choice(["グー", "チョキ", "パー"])
# リストを並び替える(返り値はNone、元のリストが変わる)
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers)解答を見る 解答を閉じる
import random
# 1. サイコロ(1〜6のランダムな整数)
dice = random.randint(1, 6)
print(f"サイコロ: {dice}") # 例: サイコロ: 4
# 2. じゃんけんの手をランダムに選ぶ
hands = ["グー", "チョキ", "パー"]
hand = random.choice(hands)
print(f"選んだ手: {hand}") # 例: 選んだ手: チョキ
# 3. リストをランダムに並び替える
numbers = [1, 2, 3, 4, 5]
random.shuffle(numbers)
print(numbers) # 例: [3, 1, 5, 2, 4]解説:
shuffle() は元のリストを直接変更する(破壊的操作)。並び替えた新しいリストが欲しい場合は
random.sample(リスト, len(リスト)) を使うと元を保持できる。
問題 2-2: osモジュール
問題:
os モジュールを使って以下を実装してください。
- 現在の作業ディレクトリ(フォルダのパス)を表示せよ
- 環境変数
PATHの値を取得して表示せよ(存在しない場合は"未設定"と表示) os.pathを使って、"Python勉強/データ構造_演習問題集.md"というパスのファイル名部分("データ構造_演習問題集.md")だけを取り出せ
💡 ヒント1(まず読む)
os モジュールはOSの機能(ファイルシステム、環境変数、パス操作など)を扱うモジュール。
import os でインポートする。
💡 ヒント2(まだ詰まってる場合)
主な機能:
os.getcwd()→ 現在の作業ディレクトリを文字列で返すos.environ.get("変数名", デフォルト値)→ 環境変数を取得(存在しない場合はデフォルト値)os.path.basename(パス)→ パスからファイル名部分だけ取り出す
💡 ヒント3(もう一歩)
import os
os.getcwd() # 現在のディレクトリ
os.environ.get("PATH", "未設定") # 環境変数
os.path.basename("フォルダ/ファイル名.md") # ファイル名部分解答を見る 解答を閉じる
import os
# 1. 現在の作業ディレクトリ
cwd = os.getcwd()
print(cwd) # 例: /Users/taiki/Documents
# 2. 環境変数 PATH を取得
path = os.environ.get("PATH", "未設定")
print(path) # 例: /usr/local/bin:/usr/bin:...
# 3. パスからファイル名部分を取り出す
full_path = "Python勉強/データ構造_演習問題集.md"
filename = os.path.basename(full_path)
print(filename) # データ構造_演習問題集.md解説:
os.environ は辞書のように使えるが、存在しないキーにアクセスするとエラーになる。
os.environ.get("KEY", デフォルト値) を使うと安全に取得できる(辞書の .get() と同じ考え方)。
os.path はパス文字列を操作するサブモジュール。
os.path.dirname() でディレクトリ部分、os.path.join() でパスを結合、
os.path.exists() でファイルの存在確認など、ファイル操作全般で頻出。
問題 2-3: datetimeモジュール
問題:
datetime モジュールを使って以下を実装してください。
- 今日の日付を
"2026年04月03日"の形式で表示せよ - 今から30日後の日付を計算して表示せよ
"2025-04-01"という文字列を日付オブジェクトに変換して、今日との差(何日前か)を計算せよ
💡 ヒント1(まず読む)
datetime モジュールには日付・時刻を扱うクラスがある。
よく使うのは:
datetime.date→ 日付(年・月・日)datetime.datetime→ 日付+時刻datetime.timedelta→ 日数・時間の差
💡 ヒント2(まだ詰まってる場合)
from datetime import date, timedelta
today = date.today() # 今日の日付オブジェクト
today.strftime("書式") # 日付を文字列にフォーマット
date.fromisoformat("2025-04-01") # 文字列から日付オブジェクトに変換
today + timedelta(days=30) # 30日後書式の例: "%Y年%m月%d日" → "2026年04月03日"
💡 ヒント3(差を計算する)
日付同士を引き算すると timedelta オブジェクトが返る。
.days プロパティで日数を取り出せる:
diff = today - past_date
print(diff.days) # 何日差か解答を見る 解答を閉じる
from datetime import date, timedelta
# 1. 今日の日付を指定フォーマットで表示
today = date.today()
print(today.strftime("%Y年%m月%d日")) # 2026年04月03日
# 2. 30日後の日付
future = today + timedelta(days=30)
print(future) # 例: 2026-05-03
# 3. "2025-04-01" との差を計算
past = date.fromisoformat("2025-04-01")
diff = today - past
print(f"{diff.days}日前") # 例: 367日前解説:
strftime() は日付を好きな形式の文字列に変換するメソッド(“string format time”の略)。
逆に文字列から日付に変換するのは strptime() または fromisoformat()。
timedelta は「時間の差」を表すオブジェクト。
日付の加減算に使い、timedelta(days=7) で1週間後、timedelta(hours=3) で3時間後なども計算できる。
第3章: 自作モジュール
ポイント: Pythonのファイル(
.py)はそのままモジュールとして使える。 共通の関数を別ファイルにまとめておくと、複数のスクリプトで再利用できる。
問題 3-1: モジュールを作る
問題:
myutils.py というファイルを作成して、以下の関数を定義してください。
greet(name)→"こんにちは、{name}さん!"を返す関数is_even(n)→nが偶数ならTrue、奇数ならFalseを返す関数clamp(value, min_val, max_val)→valueをmin_val〜max_valの範囲に収める関数- 例:
clamp(150, 0, 100)→100、clamp(-5, 0, 100)→0、clamp(50, 0, 100)→50
- 例:
💡 ヒント1(まず読む)
Pythonでは .py ファイルを作って関数を書けば、それがそのままモジュールになる。
まず myutils.py というファイルを作って、中に関数を定義するだけでOK。
💡 ヒント2(clamp関数について)
clamp は値を指定した範囲に「クリップ(切り取る)」する関数。
ゲームや画像処理でよく使われるパターン:
value < min_valならmin_valを返すvalue > max_valならmax_valを返す- それ以外は
valueをそのまま返す
if 文で書いても、Pythonの min() / max() を組み合わせても実装できる。
💡 ヒント3(もう一歩)
clamp を min() / max() で1行で書く方法:
def clamp(value, min_val, max_val):
return max(min_val, min(value, max_val))min(value, max_val) で上限を切り、max(min_val, ...) で下限を切る。
解答を見る 解答を閉じる
myutils.py:
def greet(name):
return f"こんにちは、{name}さん!"
def is_even(n):
return n % 2 == 0
def clamp(value, min_val, max_val):
return max(min_val, min(value, max_val))動作確認(同じディレクトリで実行):
import myutils
print(myutils.greet("田中")) # こんにちは、田中さん!
print(myutils.is_even(4)) # True
print(myutils.is_even(7)) # False
print(myutils.clamp(150, 0, 100)) # 100
print(myutils.clamp(-5, 0, 100)) # 0
print(myutils.clamp(50, 0, 100)) # 50解説:
n % 2 == 0 は「nを2で割った余りが0」つまり偶数の条件。
== の比較式自体が True / False を返すので、if 文なしで直接 return できる。
clamp の max(min_val, min(value, max_val)) は慣れると読みやすい定番パターン。
min(value, max_val) で「max_val を超えないようにし」、
max(min_val, ...) で「min_val を下回らないようにする」。
問題 3-2: __name__ の活用
問題:
Pythonのモジュールには __name__ という特別な変数がある。
以下を理解・実装してください。
myutils.pyに以下を追加して、直接実行したときだけテストコードが走るようにせよ- なぜこのような書き方をするのか説明せよ
# myutils.py に追加するコード
if __name__ == "__main__":
# ここにテストコードを書く
print(greet("テスト"))
print(is_even(10))
print(clamp(200, 0, 100))
💡 ヒント1(まず読む)
__name__ はPythonが自動で設定する変数:
- ファイルを直接実行したとき →
__name__は"__main__"になる - ファイルをインポートしたとき →
__name__はそのモジュール名("myutils")になる
💡 ヒント2(なぜ必要か)
if __name__ == "__main__": がないと、myutils をインポートするたびに
テストコードも実行されてしまう。
この書き方をすることで:
python myutils.py→ テスト実行されるimport myutils→ テストは実行されない(関数定義だけ読み込まれる)
解答を見る 解答を閉じる
myutils.py(完成版):
def greet(name):
return f"こんにちは、{name}さん!"
def is_even(n):
return n % 2 == 0
def clamp(value, min_val, max_val):
return max(min_val, min(value, max_val))
if __name__ == "__main__":
# このファイルを直接実行したときだけ動く
print(greet("テスト")) # こんにちは、テストさん!
print(is_even(10)) # True
print(clamp(200, 0, 100)) # 100
print("テスト完了!")解説:
if __name__ == "__main__": はPythonのほぼすべてのスクリプトで使われる定番パターン。
「このファイルが『主役』として直接実行されたときだけ実行する」という意味。
モジュールをライブラリとしてインポートする側にとっては、 テストコードや実行コードが意図せず走らないようにするための大事な仕組み。
第4章: 発展(自作パッケージ・サードパーティライブラリ)
ポイント: モジュールを複数まとめると「パッケージ」になる。 外部ライブラリは
pipでインストールして使う。
問題 4-1: 自作パッケージを作る
問題: 複数のモジュールをひとつの「パッケージ」にまとめてください。
以下の構造を作成して、main.py から両方の関数を使えるようにしてください。
mypackage/
├── __init__.py # 空ファイルでOK
├── greetings.py # greet(name) 関数を定義
└── math_utils.py # square(n)(n²を返す)関数を定義
main.py # mypackage から関数をインポートして使う
💡 ヒント1(パッケージとは)
Pythonでは、__init__.py というファイルが入ったフォルダを「パッケージ」として扱う。
フォルダ名がそのままパッケージ名になる。
mypackage/ ← フォルダ = パッケージ名
├── __init__.py ← これがあるとパッケージと認識される
└── greetings.py ← サブモジュール💡 ヒント2(インポートの書き方)
パッケージ内のモジュールをインポートするには:
from パッケージ名.モジュール名 import 関数名
# または
import パッケージ名.モジュール名例:
from mypackage.greetings import greet💡 ヒント3(init.py の活用)
__init__.py に何も書かなくてもパッケージは機能する。
ただし、よく使う関数を __init__.py に書いておくと、
from mypackage import greet のようにモジュール名を省略してインポートできる。
解答を見る 解答を閉じる
mypackage/__init__.py:
# 空でもOK(または以下のようにまとめてインポートしておく)
from mypackage.greetings import greet
from mypackage.math_utils import squaremypackage/greetings.py:
def greet(name):
return f"こんにちは、{name}さん!"mypackage/math_utils.py:
def square(n):
return n ** 2main.py(パターン1: モジュール名を使う):
from mypackage.greetings import greet
from mypackage.math_utils import square
print(greet("田中")) # こんにちは、田中さん!
print(square(5)) # 25main.py(パターン2: init.py にまとめた場合):
from mypackage import greet, square
print(greet("鈴木")) # こんにちは、鈴木さん!
print(square(9)) # 81解説:
__init__.py はパッケージの「入口」の役割を持つ。
空のままでも動くが、よく使う関数をここに import しておくと
使う側がシンプルに書けるようになる。
実際のライブラリ(例: requests)でも from requests import get のように
書けるのは、requests の __init__.py に get がインポートされているから。
問題 4-2: pipとサードパーティライブラリ
問題:
Pythonには標準ライブラリ以外に、pip でインストールする外部ライブラリがある。
以下を理解・確認してください(実際に実行しなくてもOK、読んで理解する問題)。
requestsライブラリをインストールするコマンドを書け- 以下のコードが何をしているか説明せよ
- インストール済みのライブラリ一覧を確認するコマンドを書け
import requests
response = requests.get("https://api.github.com")
print(response.status_code)
print(response.json())
💡 ヒント1(pipとは)
pip はPythonのパッケージ管理ツール。
ターミナル(コマンドプロンプト)で使うもので、Pythonコードの中では書かない。
インストール: pip install パッケージ名
アンインストール: pip uninstall パッケージ名
💡 ヒント2(requestsとは)
requests はHTTPリクエストを送るためのサードパーティライブラリ。
Webサイトや Web API にアクセスするときに使う。
requests.get(URL)→ GETリクエストを送るresponse.status_code→ HTTPステータスコード(200=成功、404=見つからない)response.json()→ レスポンスのJSONをPythonの辞書/リストに変換
💡 ヒント3(一覧確認)
pip list でインストール済みのパッケージを一覧表示できる。
pip show パッケージ名 で特定パッケージの詳細(バージョン、説明など)を確認できる。
解答を見る 解答を閉じる
# 1. requests をインストール(ターミナルで実行)
pip install requests
# 3. インストール済みライブラリの一覧確認
pip list2. コードの説明:
import requests
# GitHub の API に GET リクエストを送る
response = requests.get("https://api.github.com")
# HTTPステータスコードを表示(200 なら成功)
print(response.status_code) # 200
# レスポンスの JSON を Python の辞書として表示
print(response.json())
# 例: {'current_user_url': 'https://api.github.com/user', ...}解説: 標準ライブラリとサードパーティライブラリの違い:
| 種類 | 例 | インストール |
|---|---|---|
| 標準ライブラリ | math, os, datetime | 不要(Python に同梱) |
| サードパーティ | requests, numpy, pandas | pip install が必要 |
よく使われるサードパーティライブラリ:
requests→ HTTP通信・API呼び出しnumpy→ 数値計算・配列操作pandas→ データ分析・表データ処理matplotlib→ グラフ描画flask/fastapi→ Webアプリ開発
問題 4-3: __init__.py でパッケージの公開APIを設計する
問題:
以下のパッケージを作成し、__init__.py を使って「外から使える機能」と「内部実装」を整理してください。
calculator/
├── __init__.py # add と subtract だけを外部公開する
├── basic.py # add(a, b), subtract(a, b), _validate(a, b) を定義
└── advanced.py # multiply(a, b), divide(a, b) を定義(ただし今回は非公開)
main.py で以下が動くようにせよ:
from calculator import add, subtract
print(add(3, 5)) # 8
print(subtract(10, 4)) # 6
また、_validate のようにアンダースコアで始まる名前の意味を説明せよ。
💡 ヒント1
__init__.py には「このパッケージから外部に公開したい関数」だけをインポートして書く。
advanced.py のものは書かなければ、from calculator import multiply はエラーになる。
💡 ヒント2(アンダースコアの意味)
Pythonの慣習として、アンダースコア _ で始まる名前は「内部用(プライベート)」を意味する。
強制的に隠されるわけではないが、「外から直接呼ばないでほしい」というシグナル。
_validate→ 内部でのみ使う補助関数validate→ 外部から使ってもいい公開関数
💡 ヒント3
# basic.py の中
def _validate(a, b):
# 両方が数値かチェックする内部関数
if not (isinstance(a, (int, float)) and isinstance(b, (int, float))):
raise TypeError("数値を入力してください")
def add(a, b):
_validate(a, b)
return a + b解答を見る 解答を閉じる
calculator/basic.py:
def _validate(a, b):
"""内部用バリデーション関数(外部から直接呼ばない)"""
if not (isinstance(a, (int, float)) and isinstance(b, (int, float))):
raise TypeError("数値を入力してください")
def add(a, b):
_validate(a, b)
return a + b
def subtract(a, b):
_validate(a, b)
return a - bcalculator/advanced.py:
def multiply(a, b):
return a * b
def divide(a, b):
if b == 0:
raise ValueError("0では割れません")
return a / bcalculator/__init__.py:
# add と subtract だけを公開する
from calculator.basic import add, subtract
# advanced.py の機能はここに書かないので外部から直接は使えないmain.py:
from calculator import add, subtract
print(add(3, 5)) # 8
print(subtract(10, 4)) # 6
# これはエラーになる(公開していないので)
# from calculator import multiply # ImportError解説:
_ で始まる名前は「このモジュールの内部実装」を示す慣習。
from calculator import * のようなワイルドカードインポートでも
_validate は含まれない(Pythonが自動で除外する)。
パッケージの設計では「何を公開して何を隠すか」を意識することが重要で、
__init__.py はそのコントロールポイントとして機能する。
まとめ:モジュール・import構文の使い分け
| 構文 | 書き方 | 使いどころ |
|---|---|---|
| 基本import | import math | モジュール名を明示して使いたい |
| from import | from math import sqrt | 特定の機能だけ使いたい・毎回 math. と書くのが冗長 |
| エイリアス | import numpy as np | 慣習的な短縮名がある・長い名前を短くしたい |
| 自作モジュール | import myutils | 共通関数を複数ファイルで再利用したい |
よく使う標準ライブラリ 早見表
| モジュール | 主な用途 | よく使う機能 |
|---|---|---|
math | 数学計算 | sqrt(), pi, ceil(), floor() |
random | 乱数生成 | randint(), choice(), shuffle() |
os | OS・ファイル操作 | getcwd(), listdir(), path.join() |
datetime | 日付・時刻 | date.today(), timedelta, strftime() |
json | JSON読み書き | loads(), dumps(), load(), dump() |
sys | Pythonインタプリタ操作 | argv, exit(), path |
re | 正規表現 | search(), findall(), sub() |
最終更新: 2026年4月