こんにちは、かつコーチです。
今回は、Pythonを学び始めると必ず出てくるimportについて、基本から丁寧に解説します。
モジュールとは、変数や関数、クラスなどをまとめて保存したPythonのファイル1つのことです。
Pythonでは、便利な機能をすべて自分で書く必要はありません。
他の人が作ったモジュールや、Python自体に標準で用意されているモジュールをimport文で読み込むことで、少ないコードで多くの機能を使えるようになります。
私も学習を始めたばかりの頃、importとfrom...importの違いが分からず、なんとなくコピペで使っていた時期がありました。
この記事を読めば、import文の基本、from...importとの違い、そして自作モジュールの作り方まで、しっかり理解できます。
モジュールとは?なぜインポートが必要なのか
モジュールの定義
モジュールとは、簡単に言うと「Pythonのコードが書かれた1つの.pyファイル」のことです。
例えば、次のようなmath_utils.pyというファイルがあったとします。
# math_utils.py
def add(a, b):
return a + b
def subtract(a, b):
return a - b
このmath_utils.pyは、それ自体が1つのモジュールです。
このモジュールの中に定義されたadd関数やsubtract関数を、別のファイルから使えるようにする仕組みがインポート(import)です。
なぜモジュールに分ける必要があるのか
すべての処理を1つの巨大なファイルに書いてしまうと、次のような問題が起こります。
- どこに何の処理があるのか探しにくくなる
- 複数人で同時に開発するとき、ファイルの競合が起きやすくなる
- 同じ処理を別のプロジェクトで使い回したいときに、コピペするしかなくなる
処理の役割ごとにモジュールを分けておけば、必要な機能だけをimportして使い回せるようになります。
Pythonには、日付を扱うdatetime、乱数を扱うrandom、数学関数を扱うmathなど、あらかじめ数多くの標準モジュールが用意されています。
import文の基本の書き方
モジュール全体をインポートする
もっとも基本的な書き方は、import モジュール名です。
import math
print(math.sqrt(16)) # 4.0
print(math.pi) # 3.141592653589793
import mathと書くことで、mathモジュールの中にある関数や変数を、math.関数名という形で使えるようになります。
このように「モジュール名.」を先頭に付けることで、どのモジュールの機能を使っているかが一目で分かります。
一部の機能だけをインポートする(from…import)
モジュールの中の特定の関数や変数だけを使いたい場合は、from モジュール名 import 名前という書き方をします。
from math import sqrt, pi
print(sqrt(16)) # 4.0
print(pi) # 3.141592653589793
この書き方の場合、math.sqrt(16)ではなくsqrt(16)のように、モジュール名を省略して直接使えます。
コードは短くなりますが、後から読み返したときに「このsqrtはどこから来た関数なのか」が分かりにくくなる、というデメリットもあります。
別名を付けてインポートする(as)
モジュール名が長い場合や、名前の衝突を避けたい場合は、asを使って別名(エイリアス)を付けられます。
import pandas as pd
import numpy as np
df = pd.DataFrame({"name": ["田中", "佐藤"], "age": [20, 25]})
pandasやnumpyのようなデータ分析でよく使うライブラリは、pd・npという別名を付けるのが業界標準的な慣習になっています。
自分でモジュールにエイリアスを付ける場合も、このasの書き方を使います。
よくあるつまずきポイント・エラー対処
つまずき1:ModuleNotFoundErrorが出る
Pythonの学習でほぼ全員が一度は遭遇するのが、次のエラーです。
ModuleNotFoundError: No module named 'requests'
私も初めてこのエラーを見たとき、「import requestsと書いただけなのになぜ失敗するのか」と戸惑いました。
原因は、標準モジュールではないライブラリは、事前にインストールしておく必要があるという点にあります。
mathやrandomのような標準モジュールはPythonに最初から同梱されていますが、requestsのような外部ライブラリは別途インストールが必要です。
❌ Before:インストールせずにいきなりインポートしてしまう
import requests # インストールされていないためエラーになる
response = requests.get("https://example.com")
ModuleNotFoundError: No module named 'requests'
✅ After:pipでインストールしてからインポートする
pip install requests
import requests
response = requests.get("https://example.com")
print(response.status_code) # 200
pipとは、外部ライブラリをインストールするためのPython標準のパッケージ管理ツールです。
ModuleNotFoundErrorが出たら、まず「そのモジュールは標準モジュールか、それともpip installが必要な外部ライブラリか」を確認する癖をつけると、原因特定が早くなります。
つまずき2:自作モジュールが見つからない
自作モジュールを作って読み込もうとしたときに、次のようなエラーに遭遇することもあります。
ModuleNotFoundError: No module named 'math_utils'
これは、インポートする側のファイルと、モジュールのファイルが別のフォルダにある場合によく起こります。
project/
├── main.py
└── utils/
└── math_utils.py
❌ Before:フォルダをまたいでそのままインポートしてしまう
# main.py
import math_utils # utilsフォルダの中にあるため見つからない
print(math_utils.add(1, 2))
ModuleNotFoundError: No module named 'math_utils'
✅ After:フォルダ名を含めてインポートする
# main.py
from utils import math_utils
print(math_utils.add(1, 2)) # 3
サブフォルダの中にあるモジュールをインポートするときは、from フォルダ名 import モジュール名のように、フォルダの階層をそのままインポート文に反映させる必要があります。
私自身、フォルダ構成を整理し直した際にこのエラーに何度も遭遇し、「インポートはファイルの物理的な配置と連動している」ということを体で覚えました。
応用・一歩先の使い方
自作モジュールを作ってみる
ここまでの内容を踏まえて、実際に自作モジュールを作る手順を紹介します。
まず、計算用の関数をまとめたモジュールを用意します。
# calculator.py
def add(a, b):
return a + b
def multiply(a, b):
return a * b
TAX_RATE = 0.1
このファイルを、同じフォルダにある別のファイルからインポートして使います。
# main.py
import calculator
total = calculator.add(100, 200)
print(total) # 300
price_with_tax = 1000 * (1 + calculator.TAX_RATE)
print(price_with_tax) # 1100.0
このように、関数だけでなく変数も同じ仕組みでインポートできます。
if name == “main” の意味
自作モジュールを作るときによく見かける、次の書き方も紹介しておきます。
# calculator.py
def add(a, b):
return a + b
if __name__ == "__main__":
print(add(1, 2)) # このファイルを直接実行したときだけ動く
__name__とは、そのファイルがどのように実行されたかを表す特別な変数です。
calculator.pyを直接実行したときは__name__が"__main__"になりますが、他のファイルからimportされたときは__name__がモジュール名("calculator")になります。
この仕組みを使うと、「このモジュールを直接実行したときだけ動作確認用のコードを実行し、インポートされたときは何も実行しない」という制御ができます。
自作モジュールを作るときの定番パターンなので、覚えておくと便利です。
まとめ
この記事のポイント
- モジュールとはPythonのコードが書かれた1つの
.pyファイルのこと import モジュール名でモジュール全体を、from モジュール名 import 名前で一部の機能だけをインポートできるasで別名(エイリアス)を付けられるModuleNotFoundErrorが出たら、標準モジュールか外部ライブラリかをまず確認する- 自作モジュールをフォルダをまたいでインポートするときは、フォルダの階層をインポート文に反映させる
if __name__ == "__main__":で、直接実行されたときだけ動く処理を書ける
次に読むべき記事
モジュールの基本が分かったら、次は関数の柔軟な引数の受け取り方を押さえていきましょう。
→ 次の記事:Pythonの可変長引数(*args・**kwargs)の使い方
タグ: Python, 初心者向け, 基本文法