🔍 if __name__ == "__main__": をシンプルに理解する
ここでは」ClaudeAIを使用しそれに加筆しました
図解などがとても得意なAIです
🔍 if __name__ == "__main__": をシンプルに理解する
🎯 一言で言うと
「このファイルが直接実行されたときだけ、この部分を実行する」
📝 超シンプルな例
hello.py というファイルを作ります
# ===== hello.py =====
def greet(name):
"""挨拶する関数"""
print(f"こんにちは、{name}さん!")
#関数の定義
#関数は定義しただけでは実行されない
if __name__ == "__main__":
print("プログラム開始")
greet("太郎") #関数の呼び出し
print("プログラム終了")
🎬 使い方1: 直接実行する場合
> python hello.py
実行結果:
プログラム開始
こんにちは、太郎さん!
プログラム終了
✅ if __name__ == "__main__":の中身が実行された
🎬 使い方2: 他のファイルからimportする場合
main.py というファイルを作ります
# ===== main.py =====
import hello
print("別のプログラムです")
hello.greet("花子")
> python main.py
実行結果:
別のプログラムです
こんにちは、花子さん!
❌ 「プログラム開始」「プログラム終了」は表示されない
✅ greet()関数だけが使える
📊 何が起こっているか?
直接実行の場合
# python hello.py で実行
# このとき __name__ は?
print(__name__) # 出力: __main__
if __name__ == "__main__": # "__main__" == "__main__" → True
# ここが実行される!
print("プログラム開始")
greet("太郎")
importされた場合
# import hello で読み込まれた
# このとき __name__ は?
print(__name__) # 出力: hello
if __name__ == "__main__": # "hello" == "__main__" → False
# ここはスキップされる!
print("プログラム開始") # 実行されない
greet("太郎") # 実行されない
🎭 比較図
┌─────────────────────────────────────────────────┐
│ 直接実行 python hello.py
├─────────────────────────────────────────────────┤
│ __name__ = "__main__"
│
│ def greet(name):
│ print(f"こんにちは、{name}さん!")
│
│ if __name__ == "__main__": ← True
│ print("プログラム開始") ✅ 実行される
│ greet("太郎") ✅ 実行される
│ print("プログラム終了") ✅ 実行される
└─────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────┐
│ importされた
│ import hello
├─────────────────────────────────────────────────┤
│ __name__ = "hello"
│
│ def greet(name):
│ print(f"こんにちは、{name}さん!")
│
│ if __name__ == "__main__": ← False
│ print("プログラム開始") ❌ スキップ
│ greet("太郎") ❌ スキップ
│ print("プログラム終了") ❌ スキップ
└─────────────────────────────────────────────────┘
💡 なぜこれが必要?
悪い例:if __name__を使わない場合
# ===== hello_bad.py =====
def greet(name):
print(f"こんにちは、{name}さん!")
# if __name__ を使わない
print("プログラム開始")
greet("太郎")
print("プログラム終了")
直接実行 → 問題なし
> python hello_bad.py
プログラム開始
こんにちは、太郎さん!
プログラム終了
importすると... 問題発生!
# ===== main.py =====
import hello_bad
> python main.py
プログラム開始 ← 勝手に実行された!
こんにちは、太郎さん! ← 意図してないのに!
プログラム終了 ← 困る!
✅ 良い例:if __name__を使う場合
# ===== hello.py =====
def greet(name):
print(f"こんにちは、{name}さん!")
if __name__ == "__main__":
print("プログラム開始")
greet("太郎")
print("プログラム終了")
importしても大丈夫!
# ===== main.py =====
import hello
# 何も勝手に実行されない
# 関数だけ使える
hello.greet("花子")
> python main.py
こんにちは、花子さん! ← 自分で呼び出した分だけ
🎯 もう1つの例:計算プログラム
calculator.py
# ===== calculator.py =====
def add(a, b):
"""足し算"""
return a + b
def multiply(a, b):
"""掛け算"""
return a * b
# 直接実行されたときだけ動く部分
if __name__ == "__main__":
print("計算プログラム")
result1 = add(5, 3)
print(f"5 + 3 = {result1}")
result2 = multiply(4, 7)
print(f"4 × 7 = {result2}")
使い方1:直接実行
> python calculator.py
計算プログラム
5 + 3 = 8
4 × 7 = 28
使い方2:他のファイルから関数を使う
# ===== my_program.py =====
import calculator
# 関数だけ使える
answer = calculator.add(10, 20)
print(f"答え: {answer}")
> python my_program.py
答え: 30
「計算プログラム」などは表示されない!
📚 実用例:テストとメイン処理の分離
game.py(ゲーム本体)
# ===== game.py =====
def play_game(player_name):
"""ゲームをプレイする"""
print(f"{player_name}がゲームを始めました!")
score = 100
print(f"スコア: {score}")
return score
# 直接実行されたときは、実際にゲームを始める
if __name__ == "__main__":
print("=== ゲーム開始 ===")
play_game("プレイヤー1")
print("=== ゲーム終了 ===")
python game.py
=== ゲーム開始 ===
プレイヤー1がゲームを始めました!
スコア: 100
=== ゲーム終了 ===
test_game.py(テストプログラム)
# ===== test_game.py =====
import game
# テストデータで関数を試す
print("テスト開始")
score = game.play_game("テストユーザー")
if score == 100:
print("✅ テスト成功")
else:
print("❌ テスト失敗")
python test_game.py
テスト開始
テストユーザーがゲームを始めました!
スコア: 100
✅ テスト成功
---
## 🎯 まとめ
### `if __name__ == "__main__":` の役割
【このファイルを直接実行】
python my_file.py
↓
if name == "main": の中が実行される ✅
【他のファイルからimport】
import my_file
↓
if name == "main": の中はスキップ ❌
関数定義だけ読み込まれる
### メリット
1. **1つのファイルで2つの使い方ができる**
- 単体で実行 → プログラムとして動く
- import → ライブラリとして使える
2. **勝手に実行されない**
- importしただけで処理が始まらない
- 必要な関数だけ使える
3. **テストしやすい**
- 本番コードとテストコードを分離できる
---
## 💡 簡単な覚え方
```python
if __name__ == "__main__":
# ここは「メインプログラムとして実行されたときだけ」動く
# importされたときは動かない
イメージ:
「もし私がメインとして呼ばれたなら」
→ はい、この部分を実行します
「もし私がサポート(import)として呼ばれたなら」
→ いいえ、関数の準備だけします
📝 実践テンプレート
# ===== your_program.py =====
# 関数定義(誰でも使える部分)
def function1():
pass
def function2():
pass
# メイン処理(直接実行したときだけ動く部分)
if __name__ == "__main__":
print("プログラム開始")
function1()
function2()
print("プログラム終了")
このテンプレートを使えば、どんなプログラムでも対応できます!
passのところに何かしらの処理を入れて試してください