ここでは「eval() を使った式入力式電卓」を、初心者にもわかるように安全に・便利に作っていきます。
式入力式電卓とは?
ユーザーが
2+3*4
のように数式そのものを入力すると、
Python がそのまま計算して結果を表示する電卓です。
基本版:シンプル eval 電卓
# --- シンプル eval 電卓 ---
print("=== 式入力式 電卓 ===")
print("例: 2+3*4, (10-3)/2 など")
print("終了するには quit と入力")
while True:
expr = input("\n式を入力してください: ").strip()
if expr.lower() in ["quit", "exit"]:
print("🧾 終了します。ありがとうございました!")
break
try:
result = eval(expr)
print("結果 =", result)
except Exception as e:
print("⚠ エラー:", e)
Python実行例
=== 式入力式 電卓 ===
例: 2+3*4, (10-3)/2 など
終了するには quit と入力
式を入力してください: 2+3*4
結果 = 14
式を入力してください: (10-3)/2
結果 = 3.5
式を入力してください: quit
🧾 終了します。ありがとうございました!
⚠️ 注意:eval() の危険性
eval() は Python の式をそのまま実行する関数。
便利ですが、次のような式を入力されると、悪意あるコードが実行されてしまいます。
__import__('os').system('rm -rf /') # 💀 非常に危険!
Python初心者の学習・個人環境での遊び目的ならOKですが、
実際のアプリで eval を直接使うのはNG!
🔒 安全な版(safe_eval 風)
危険な関数や変数を無効化して、安全な eval に近づけます。
ここでは四則演算・数学関数(math モジュール)だけを許可します。
import math
# --- 安全な eval 電卓 ---
print("=== 安全式電卓 ===")
print("例: 2+3*4, math.sqrt(9), sin(0.5)")
print("利用可能: math の関数 (sin, cos, sqrt, pow など)")
print("終了するには quit")
# 許可する名前を制限
allowed_names = {k: v for k, v in math.__dict__.items() if not k.startswith("__")}
while True:
expr = input("\n式を入力してください: ").strip()
if expr.lower() in ["quit", "exit"]:
print("🧾 終了します。")
break
try:
# 制限付き eval
result = eval(expr, {"__builtins__": None}, allowed_names)
print("結果 =", result)
except Exception as e:
print("⚠ エラー:", e)
Python実行例
=== 安全式電卓 ===
例: 2+3*4, math.sqrt(9), sin(0.5)
利用可能: math の関数 (sin, cos, sqrt, pow など)
終了するには quit
式を入力してください: 2+3*4
結果 = 14
式を入力してください: sqrt(16)
結果 = 4.0
式を入力してください: pow(2, 10)
結果 = 1024.0
💡 解説ポイント
| 部分 | 説明 |
|---|---|
eval(expr) | 文字列 expr を Python の式として評価 |
try/except | 入力エラーを防止 |
{"__builtins__": None} | 危険な関数 (open, os, など) を使えなくする |
allowed_names | math モジュールの関数だけを許可 |
quit / exit | 文字列で終了指示を処理 |
発展アイデア
| アイデア | 内容 |
|---|---|
| 🧾 履歴を記録 | 入力式と結果をリストまたはファイルに保存する |
| 🧮 定数サポート | π や e を自動で math.pi / math.e に展開 |
| 🎨 GUI 電卓 | tkinter や PyQt で見た目つきの電卓に |
| 💬 「前回の結果」再利用 | ans 変数で前の結果を保持する(ans + 5など) |
前回の結果を使えるようにしたバージョン
import math
print("=== 式電卓 (ans対応) ===")
print("例: 2+3*4, sqrt(9), ans*2")
print("終了: quit")
allowed = {k: v for k, v in math.__dict__.items() if not k.startswith("__")}
ans = 0
while True:
expr = input("\n式を入力してください: ").strip()
if expr.lower() in ["quit", "exit"]:
break
try:
allowed["ans"] = ans
result = eval(expr, {"__builtins__": None}, allowed)
ans = result
print("結果 =", result)
except Exception as e:
print("⚠ エラー:", e)
Python💬 実行例:
式を入力してください: 10+5
結果 = 15
式を入力してください: ans*2
結果 = 30
✅ これで完成!
この「eval 電卓」は、
input()の基本- 文字列処理(
strip) - 例外処理
- 変数の再利用
がぜんぶ練習できる、とても良い教材になります。
